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    |

我想要返回的是:

  1. 计算所有组合(例如交叉连接),并且
  2. 还包括组合出现的次数。

我知道如何使用简单的 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 joingroup 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 值非常简单,但需要更多的逻辑。