簡體   English   中英

計數列和求和

[英]Count columns and sum

我對SQL非常陌生,我有一個帶有ID(問題ID)和風險區域(risk1,risk2和risk3)的表。

+----+-------+------+------+
| id | risk1 | risk2| risk3|
+----+-------+------+------+
| 0  |   h   |   l  |   h  |
| 1  |   m   |   l  |   l  |
| 2  |   h   |   h  |   h  |
| 3  |   l   |   l  |   h  |
+----+-------+------+------+

我的目的是為各個ID計算“ h”之和。 例如,對於id = 0,查詢應返回“ 2”,對於id = 1,返回“ 0”,對於id = 2,返回“ 3”,對於id = 3,返回“ 1”。 任何建議將不勝感激。

單程:

SELECT
    id,
    IF(COALESCE(risk1, '') = 'h', 1, 0) +
    IF(COALESCE(risk2, '') = 'h', 1, 0) +
    IF(COALESCE(risk3, '') = 'h', 1, 0) AS h_sum
FROM yourTable
ORDER BY id;

只是為了好玩,這是使用字符串處理的更奇特的方式:

SELECT
    id,
    3 - LENGTH(REPLACE(CONCAT(risk1, risk2, risk3), 'h', '')) AS h_sum
FROM yourTable
ORDER BY id;

在此處輸入圖片說明

演示版

為了使第二種方法也為NULL安全,只需使用COALESCE(risk1, '')代替risk1 (其他列也是如此)。

MySQL將布爾表達式視為數字,因此很容易表達:

select id,
       ( (risk1 = 'h') + (risk2 = 'h') + (risk3 = 'h') ) as num_hs
from t;

注意:這假定所有值都不為NULL (對於您的數據,情況似乎如此)。

更為傳統的(我們可以說“更好”的)解決方案可能如下:

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL
,risk_no INT NOT NULL
,risk_type CHAR(1) NOT NULL
,PRIMARY KEY(id,risk_no)
);

INSERT INTO my_table VALUES
(1,1,'h'),
(2,1,'m'),
(3,1,'h'),
(4,1,'l'),

(1,2,'l'),
(2,2,'l'),
(3,2,'h'),
(4,2,'l'),

(1,3,'h'),
(2,3,'l'),
(3,3,'h'),
(4,3,'h');

SELECT id, COUNT(*) total FROM my_table WHERE risk_type = 'h' GROUP BY id;
+----+-------+
| id | total |
+----+-------+
|  1 |     2 |
|  3 |     3 |
|  4 |     1 |
+----+-------+

要么

SELECT id, SUM(risk_type = 'h') total FROM my_table GROUP BY id;
+----+-------+
| id | total |
+----+-------+
|  1 |     2 |
|  2 |     0 |
|  3 |     3 |
|  4 |     1 |
+----+-------+

一個簡單的[詳細]查詢是:

select
  id,
  case when risk1 = 'h' then 1 end +
  case when risk2 = 'h' then 1 end +
  case when risk3 = 'h' then 1 end as sum_h
from t

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM