SQL - 统计具有特定值的行数

24

我有一个表格,看起来有点像这样:

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

现在,针对每个id,我想要计算0和1的出现次数以及该ID的出现次数(该值可以是任意整数),因此最终结果应该类似于这样:

id  n0  n1  total
1   2   2   5
2   1   2   4
3   2   0   3

我用这个语句获取了第一行和最后一行:

SELECT id, COUNT(*) FROM mytable GROUP BY id;

但我有些迷茫。你有什么指导,如何在不使用大量语句的情况下实现这一点?

2个回答

45

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

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

sqlfiddle 上查看。


1
太好了,我甚至不知道还有SUM(condition)这个函数! - ryyst
2
@ryyst:这是一种利用MySQL对条件表达式的布尔结果进行评估的技巧,如果为假则为0,如果为真则为1;因此,在每个组上进行SUM操作可以提供满足条件的记录计数。 - eggyal
11
你还可以更表达性地使用 COUNT(CASE WHEN value=0 THEN 1 END) AS n0, ..., ...,这样在所有其他主要的DBMS中都可以工作,因为MySQL是唯一会进行隐式布尔转换的DBMS。请参阅我在 此处的问题 以获取更多信息。 - Zane Bien

0

正如@Zane在上面评论中提到的,通常的方法是使用CASE表达式来执行数据透视。

SQL Server现在有一个PIVOT运算符,您可能会看到。DECODE()和IIF()是Oracle和Access上旧的方法,您可能仍然会发现它们存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接