计数列和求和

时间:2019-05-27 14:10:21

标签: mysql sql

我对SQL非常陌生,我有一个表,其中包含ID(问题ID)和风险区域(risk1,risk2和risk3)。

int(r[2][0])

我的目的是为各个ID计算“ h”之和。例如,对于id = 0,查询应返回“ 2”,对于id = 1,返回“ 0”,对于id = 2,返回“ 3”,对于id = 3,返回“ 1”。任何建议将不胜感激。

4 个答案:

答案 0 :(得分:3)

一种方法:

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;

enter image description here

Demo

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

答案 1 :(得分:2)

MySQL将布尔表达式视为数字,因此很容易表达:

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

注意:这假设所有值都不是NULL,看来您的数据就是这种情况。

答案 2 :(得分:1)

一个更常规的(我们可以说“更好”的)解决方案如下:

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 |
+----+-------+

答案 3 :(得分:0)

一个简单的[详细]查询是:

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