SQL Return 两列的所有组合及其出现次数
SQL Return All Combinations of Two Columns and Their Number of Occurences
我正在尝试在 SQL 中做一些我可能做不到的事情。我有一个 table 这种类型的数据(显示的是合成数据):
columnn1 | column2 | ...
------------------------
A | 1 |
B | 1 |
C | 2 |
A | 2 |
D | 3 |
A | 1 |
B | 1 |
我想要返回的是:
- 计算所有组合(例如交叉连接),并且
- 还包括组合出现的次数。
我知道如何使用简单的 CROSS JOIN 进行组合。我还可以通过简单的 GROUP BY 子句获得组合的数量。但是,有没有一种方法可以有效地将这些组合成一个查询?我想尽量避免的是生成和保存中间 table。我想要的输出如下所示:
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
我真的不在乎计数是零(首选)还是空值。我也不关心列的排序顺序。我已经进行了一些搜索,但似乎无法在不生成和保存中间体 table 的情况下找到执行此操作的方法。不过,我可能只是忽略了一些愚蠢的事情。提前致谢!
假设 table 中的 none 个值为 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
值非常简单,但需要更多的逻辑。
我正在尝试在 SQL 中做一些我可能做不到的事情。我有一个 table 这种类型的数据(显示的是合成数据):
columnn1 | column2 | ...
------------------------
A | 1 |
B | 1 |
C | 2 |
A | 2 |
D | 3 |
A | 1 |
B | 1 |
我想要返回的是:
- 计算所有组合(例如交叉连接),并且
- 还包括组合出现的次数。
我知道如何使用简单的 CROSS JOIN 进行组合。我还可以通过简单的 GROUP BY 子句获得组合的数量。但是,有没有一种方法可以有效地将这些组合成一个查询?我想尽量避免的是生成和保存中间 table。我想要的输出如下所示:
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
我真的不在乎计数是零(首选)还是空值。我也不关心列的排序顺序。我已经进行了一些搜索,但似乎无法在不生成和保存中间体 table 的情况下找到执行此操作的方法。不过,我可能只是忽略了一些愚蠢的事情。提前致谢!
假设 table 中的 none 个值为 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
值非常简单,但需要更多的逻辑。