You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在SQL结果中添加计数列,统计mode列0和1的出现次数

统计SQL表中mode列0和1的数量问题

我有一个包含10000行数据的数据集,表名为unpopular_songs,其中一列名为mode,取值为整数0或1。希望编写SQL查询统计该列中0和1的数量,但尝试的几个查询都没达到预期:

尝试过的查询及问题

  1. 仅返回mode取值,无计数:
SELECT mode
FROM unpopular_songs
GROUP BY mode;

该查询仅输出两行数据(0和1),无法看到对应数值的出现次数。

  1. 只能单独统计0的数量:
SELECT 
    COUNT(mode) AS minor
FROM unpopular_songs
WHERE mode = '0';

此查询返回一列MINOR,值为3905,但无法同时获取1的统计结果(希望命名为MAJOR)。

  1. 合并统计的查询报错:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:57:24