我正在尝试用SQL做一些我可能做不到的事情。我有一个包含此类数据的表(显示合成数据):
columnn1 | column2 | ...
------------------------
A | 1 |
B | 1 |
C | 2 |
A | 2 |
D | 3 |
A | 1 |
B | 1 |
我想要回来的是:
我知道如何使用简单的CROSS JOIN进行组合。我还可以使用简单的GROUP BY子句获得组合的数量。但是,有没有办法有效地将这些组合成一个查询?我想要避免的是生成和保存中间表。我想的输出看起来像这样:
columnn1 | column2 | count
---------------------------
A | 1 | 2
A | 2 | 1
A | 3 | 0 (or null)
B | 1 | 2
B | 2 | 0 (or null)
B | 3 | 0 (or null)
C | 1 | 0 (or null)
C | 2 | 1
C | 3 | 0 (or null)
D | 1 | 0 (or null)
D | 2 | 0 (or null)
D | 3 | 1
我真的不在乎计数是零(首选)还是nullls。我也不关心列的排序顺序。我做了一些搜索,似乎无法在不生成和保存中间表的情况下找到方法。我可能只是忽视了一些愚蠢的事情。提前谢谢!
答案 0 :(得分:1)
假设表中没有值NULL
,您可以采取以下策略。使用cross join
获取两列的所有组合 - 甚至是数据中没有的组合。
然后使用left join
和group by
来获取您要查找的计数:
select c1.col1, c2.col2, count(t.col1)
from (select distinct col1 from table) c1 cross join
(select distinct col2 from table) c2 left join
table t
on t.col1 = c1.col1 and t.col2 = c2.col2
group by c1.col1, c2.col2;
处理NULL
值非常简单,但需要更多逻辑。