SQL问题:如何将同类型空Group行的数量计入非空Group行统计?
解决方案
你的原始SQL仅完成了基础的分组统计,未实现将同Type下空Group的数量合并到对应非空Group的逻辑。以下是满足需求的SQL语句:
WITH base_stats AS ( -- 统计每个Type+Group的原始数量 SELECT type, `group`, -- MySQL用反引号,PostgreSQL替换为双引号 COUNT(*) AS original_count FROM your_table -- 替换为你的实际表名 GROUP BY type, `group` ), null_group_totals AS ( -- 提取每个Type下Group为空的总数量 SELECT type, original_count AS null_total FROM base_stats WHERE `group` IS NULL ) SELECT bs.type, bs.`group`, -- 非空Group数量=原始数量+同Type空Group数量;空Group保留原始统计数 CASE WHEN bs.`group` IS NOT NULL THEN bs.original_count + COALESCE(ngt.null_total, 0) ELSE bs.original_count END AS amount FROM base_stats bs LEFT JOIN null_group_totals ngt ON bs.type = ngt.type ORDER BY bs.type, bs.`group`;
关键说明:
- 用CTE拆分逻辑:
base_stats:先获取每个Type和Group的基础统计值。null_group_totals:单独统计每个Type下Group为空的数量。
- 通过
LEFT JOIN将空Group的数量关联到同Type的非空Group,COALESCE处理无空Group的Type(如Kiwi),避免计算出现NULL。 CASE语句区分计算逻辑:非空Group叠加同Type空Group的数量,空Group保留原始统计结果。group是SQL关键字,需用反引号/双引号包裹,避免语法错误。
执行后会得到你需要的结果:
| Type | Group | Amount |
|---|---|---|
| Apple | A | 2 |
| Apple | C | 3 |
| Apple | 1 | |
| Kiwi | B | 1 |
| Kiwi | C | 1 |
| Orange | 2 |
内容的提问来源于stack exchange,提问作者Leeloo Dallas
相关产品推荐
相关产品推荐

