SQLite:如何将GROUP BY结果转为无重复countable的两列展示
解决方案:将两个Collection的Count值转为列展示
针对你的需求,最简洁的方案是使用条件聚合,通过CASE WHEN配合聚合函数,将两个指定Collection的Count值分别提取为独立列,同时保证每个Countable仅返回一行结果。
核心SQL查询
SELECT c.id AS countableId, c.name AS countableName, MAX(CASE WHEN co.collectionId = 3 THEN co.count END) AS primaryCount, MAX(CASE WHEN co.collectionId = 4 THEN co.count END) AS secondaryCount FROM countable c LEFT JOIN count co ON c.id = co.countableId WHERE co.collectionId IN (3, 4) GROUP BY c.id, c.name;
逻辑说明
- 条件筛选:用
CASE WHEN匹配目标Collection的ID(3和4),仅提取对应Count值,不匹配的记录返回NULL。 - 聚合去重:通过
MAX()聚合函数(因每个Countable+CollectionID组合唯一,也可使用SUM()),将每个Countable的两条记录合并为一行,自动过滤NULL值。 - 关联表:
LEFT JOIN确保即使某个Countable在目标Collection中无记录,仍会被保留(此时对应列返回NULL)。
优化:处理无记录的情况
如果希望无对应Count记录时显示0而非NULL,可使用COALESCE()函数包装聚合结果:
SELECT c.id AS countableId, c.name AS countableName, COALESCE(MAX(CASE WHEN co.collectionId = 3 THEN co.count END), 0) AS primaryCount, COALESCE(MAX(CASE WHEN co.collectionId = 4 THEN co.count END), 0) AS secondaryCount FROM countable c LEFT JOIN count co ON c.id = co.countableId AND co.collectionId IN (3, 4) GROUP BY c.id, c.name;
示例数据查询结果
执行上述优化后的查询,会得到如下结果:
| countableId | countableName | primaryCount | secondaryCount |
|---|---|---|---|
| 1 | Example | 0 | 5 |
| 2 | Test | 0 | 0 |
| 3 | Foo | 0 | 0 |
| 4 | Bar | 5 | 3 |
内容的提问来源于stack exchange,提问作者Letsric
相关产品推荐
相关产品推荐

