sql - 所有计数组合
问题描述
我有一个表,其中包含 product_id、status 列,例如:
product_id | 地位 |
---|---|
1 | 好的 |
2 | 坏的 |
1 | 好的 |
3 | 坏的 |
2 | 坏的 |
1 | 好的 |
我想显示 product_ID 和状态的所有可能组合的计数:
product_id | 地位 | 数数 |
---|---|---|
1 | 好的 | 3 |
1 | 坏的 | 0 |
2 | 好的 | 0 |
2 | 坏的 | 2 |
3 | 好的 | 0 |
3 | 坏的 | 1 |
我发现的解决方案是我可以使用笛卡尔连接,然后将其与常规计数联合并汇总结果(工作正常):
SELECT product_id, status, SUM(cnt) FROM (
---all combinations, no count
SELECT DISTINCT t1.product_id, t2.status, 0 AS cnt
FROM
details t1,
details t2
UNION
---counts of existing combinations
SELECT DISTINCT product_id, status, COUNT(status) AS cnt
FROM details
GROUP BY product_id, status) AS T1
GROUP BY product_id, status
现在我想知道,这里有更好的方法吗?
我用 PostgreSQL 和 Access SQL 学习 SQL。添加注释以澄清(在访问代码中省略)。
解决方案
用于CROSS JOIN
构建所有组合并使用LEFT JOIN
:
SELECT p.product_id, s.status, COUNT(t.any_not_null_column)
FROM (SELECT DISTINCT product_id FROM t) AS p
CROSS JOIN (SELECT DISTINCT status FROM t) AS s
LEFT JOIN t ON p.product_id = t.product_id AND s.status = t.status
GROUP BY p.product_id, s.status