首页 > 解决方案 > 所有计数组合

问题描述

我有一个表,其中包含 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。添加注释以澄清(在访问代码中省略)。

标签: sqlcount

解决方案


用于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

推荐阅读