SQL - 计算具有特定值的行

ryy*_*yst 20 mysql sql

我有一个看起来像这样的表:

id  value
1   0
1   1
1   2
1   0
1   1
2   2
2   1
2   1
2   0
3   0
3   2
3   0
Run Code Online (Sandbox Code Playgroud)

现在对于每一个id,我想计算0和1的出现次数以及该ID的出现次数(该值可以是任何整数),因此最终结果应如下所示:

id  n0  n1  total
1   2   2   5
2   1   2   4
3   2   0   3
Run Code Online (Sandbox Code Playgroud)

我设法得到了这句话的第一行和最后一行:

SELECT id, COUNT(*) FROM mytable GROUP BY id;
Run Code Online (Sandbox Code Playgroud)

但我有点迷失在这里.如果没有一个巨大的声明如何实现这一点的任何指针?

egg*_*yal 33

使用MySQL,您可以使用SUM(condition):

SELECT   id, SUM(value=0) AS n0, SUM(value=1) AS n1, COUNT(*) AS total
FROM     mytable
GROUP BY id
Run Code Online (Sandbox Code Playgroud)

sqlfiddle上看到它.

  • 您也可以更具表现力并使用`COUNT(CASE WHEN value = 0 THEN 1 END)AS n0,...,...`,这将适用于所有其他主要DBMS,因为MySQL是唯一一个使隐式布尔值转换.有关详细信息,请参阅我的[此处提问](http://stackoverflow.com/questions/11340540/conditional-counting-performance-differences-in-using-sum-vs-count). (9认同)
  • @ryyst:嗯,这是一个利用MySQL将条件表达式的布尔结果评估为0(如果为false)和1(如果为真)的事实的技巧; 因此,对每个组取"SUM"可以计算条件为真的那些记录. (2认同)