SQL如何使用CASE语句实现多列分组分类计数
多字段分类统计SQL实现方案
核心思路:你已经掌握的单字段CASE WHEN返回1/0的判断逻辑,完全可以直接复用——同一分类下的统计值,本质就是把分类内每个字段的判断结果(满足值>0记1,否则记0)做算术求和,不需要编写复杂的多分支嵌套判断。
全数据库兼容通用写法
这套写法适配MySQL、PostgreSQL、SQL Server、Oracle、BigQuery等所有主流SQL引擎,不会出现语法兼容问题:
SELECT person_name, -- 人员姓名字段 Red, Blue, Apple, Grapes, -- 计算颜色类统计值 CASE WHEN Red > 0 THEN 1 ELSE 0 END + CASE WHEN Blue > 0 THEN 1 ELSE 0 END AS Colors, -- 计算水果类统计值 CASE WHEN Apple > 0 THEN 1 ELSE 0 END + CASE WHEN Grapes > 0 THEN 1 ELSE 0 END AS Fruit FROM your_sample_dataset_table; -- 替换为你的示例数据集表名
逻辑校验完全匹配需求:
- 以John Smith的记录为例:若Red=2、Blue=3,两个字段判断都返回1,相加后
Colors值为2 - 若某条记录Red=0、Blue=4,判断后返回0+1,
Colors值为1 - 若两个颜色字段值都为0,
Colors值为0 - 水果类
Fruit列的统计逻辑和颜色类完全一致
特定数据库简化写法
对于MySQL、PostgreSQL、SQLite等支持布尔值隐式转换为数值(判断为真等价于1,判断为假等价于0)的数据库,可以省略CASE语句简化代码:
SELECT person_name, (Red > 0) + (Blue > 0) AS Colors, (Apple > 0) + (Grapes > 0) AS Fruit FROM your_sample_dataset_table;
注意:SQL Server、Oracle不支持布尔值直接参与算术运算,这类环境请使用前面的通用CASE写法,避免触发语法错误。
内容的提问来源于stack exchange,提问作者Void S
相关产品推荐
相关产品推荐

