SQL按dealer分组统计laptop、desktop、tablet数量的方法
需求说明
现有数据表结构与样例数据如下:
| dealer | desktop | tablet |
|---|---|---|
| A | 1 | 0 |
| A | 1 | 0 |
| B | 0 | 1 |
| C | 0 | 0 |
| A | 0 | 1 |
| A | 1 | 0 |
| C | 0 | 1 |
| C | 0 | 0 |
| C | 0 | 0 |
| B | 0 | 1 |
| B | 0 | 0 |
| B | 0 | 0 |
| A | 0 | 0 |
需要完成以下统计:
- 按
dealer字段分组 - 分组后分别统计三类设备的记录数:
- desktop数量:
desktop = 1的记录 - laptop数量:满足
desktop = 0 AND tablet = 0的记录 - tablet数量:
tablet = 1的记录
- desktop数量:
- 最终输出字段顺序为
dealer | laptop | desktop | tablet
基础分组语句只能统计每个dealer的总记录数,无法实现分类计数:
SELECT dealer, COUNT(*) FROM table GROUP BY dealer
实现方法
用条件聚合即可完成分类统计,在聚合函数内写入匹配规则,只统计符合对应类型的记录:
SELECT dealer, SUM(CASE WHEN desktop = 0 AND tablet = 0 THEN 1 ELSE 0 END) AS laptop, SUM(CASE WHEN desktop = 1 THEN 1 ELSE 0 END) AS desktop, SUM(CASE WHEN tablet = 1 THEN 1 ELSE 0 END) AS tablet FROM 你的实际表名 GROUP BY dealer;
补充说明
- 上述写法的逻辑是逐行判断记录所属类型,匹配到对应类型就标记为1,否则标记为0,分组后对每类的标记值求和,结果就是该类型的记录总数
- 也可以用
COUNT函数实现相同效果,写法为COUNT(CASE WHEN 匹配规则 THEN 1 END),COUNT会自动忽略NULL值,不符合规则的记录不会被计入,和SUM写法执行结果完全一致 - 针对提供的样例数据,执行上述SQL后返回结果如下:
| dealer | laptop | desktop | tablet |
|---|---|---|---|
| A | 1 | 3 | 1 |
| B | 2 | 0 | 2 |
| C | 3 | 0 | 1 |
注意:如果你的表名是
table,属于SQL保留关键字,查询时需要做转义:MySQL环境用反引号包裹写为`table`,SQL Server环境用方括号包裹写为[table],否则会报语法错误。
内容的提问来源于stack exchange,提问作者Dhaval Jardosh
相关产品推荐
相关产品推荐

