在SQL结果中添加计数列,统计mode列0和1的出现次数
统计SQL表中mode列0和1的数量问题
我有一个包含10000行数据的数据集,表名为unpopular_songs,其中一列名为mode,取值为整数0或1。希望编写SQL查询统计该列中0和1的数量,但尝试的几个查询都没达到预期:
尝试过的查询及问题
- 仅返回mode取值,无计数:
SELECT mode FROM unpopular_songs GROUP BY mode;
该查询仅输出两行数据(0和1),无法看到对应数值的出现次数。
- 只能单独统计0的数量:
SELECT COUNT(mode) AS minor FROM unpopular_songs WHERE mode = '0';
此查询返回一列MINOR,值为3905,但无法同时获取1的统计结果(希望命名为MAJOR)。
- 合并统计的查询报错:
SELECT COUNT(mode = '0') AS minor COUNT(mode = '1') AS major FROM unpopular_songs;
报错原因是两个列定义之间缺少逗号,且COUNT(mode = '0')的写法无法正确统计符合条件的行数(COUNT会统计所有非NULL值,不管条件是否为真)。
正确的解决方案
方法1:条件聚合(通用所有SQL数据库)
使用CASE WHEN实现条件统计,这是最通用的方案:
SELECT COUNT(CASE WHEN mode = 0 THEN 1 END) AS minor, COUNT(CASE WHEN mode = 1 THEN 1 END) AS major FROM unpopular_songs;
或者用SUM结合条件表达式:
SELECT SUM(CASE WHEN mode = 0 THEN 1 ELSE 0 END) AS minor, SUM(CASE WHEN mode = 1 THEN 1 ELSE 0 END) AS major FROM unpopular_songs;
方法2:先分组统计再转列
先通过GROUP BY得到每个mode的计数,再用条件聚合转成横向列:
SELECT MAX(CASE WHEN mode = 0 THEN cnt END) AS minor, MAX(CASE WHEN mode = 1 THEN cnt END) AS major FROM ( SELECT mode, COUNT(*) AS cnt FROM unpopular_songs GROUP BY mode ) AS sub_query;
方法3:MySQL专用简化写法
如果使用MySQL,可以用IF函数替代CASE WHEN:
SELECT SUM(IF(mode = 0, 1, 0)) AS minor, SUM(IF(mode = 1, 1, 0)) AS major FROM unpopular_songs;
内容的提问来源于stack exchange,提问作者Gavin Gayden
相关产品推荐
相关产品推荐

