如何用SQL分别统计各列中每个类别的总数?
解决方案
原始数据集
| gender | ssc_b |
|---|---|
| F | Central |
| F | Central |
| F | Other |
| M | Central |
| M | Other |
当前按两列组合分组的统计结果
| gender | num_gender | ssc_b | num_ssc_b |
|---|---|---|---|
| F | 2 | Central | 2 |
| F | 1 | Other | 1 |
| M | 1 | Central | 1 |
| M | 1 | Other | 1 |
期望的统计结果
| gender | num_gender | ssc_b | num_ssc_b |
|---|---|---|---|
| F | 3 | Central | 3 |
| M | 2 | Other | 2 |
要实现分别统计gender和ssc_b各分类的总数并按上述格式输出,可以用以下SQL语句:
WITH gender_summary AS ( SELECT gender, COUNT(*) AS num_gender, ROW_NUMBER() OVER (ORDER BY gender) AS row_id FROM your_table GROUP BY gender ), ssc_b_summary AS ( SELECT ssc_b, COUNT(*) AS num_ssc_b, ROW_NUMBER() OVER (ORDER BY ssc_b) AS row_id FROM your_table GROUP BY ssc_b ) SELECT gs.gender, gs.num_gender, sbs.ssc_b, sbs.num_ssc_b FROM gender_summary gs INNER JOIN ssc_b_summary sbs ON gs.row_id = sbs.row_id ORDER BY gs.gender;
说明
- 用两个CTE(公共表表达式)分别统计
gender和ssc_b的分类总数,同时用ROW_NUMBER()为每个统计行生成唯一编号 - 通过编号将两个统计结果表关联,把两类统计结果合并到同一张表中
- 替换语句中的
your_table为实际的表名
内容的提问来源于stack exchange,提问作者vie.luo
相关产品推荐
相关产品推荐

