SQL返回两列的所有组合及其出现的数量

时间:2015-08-12 18:41:39

标签: sql join outer-join

我正在尝试用SQL做一些我可能做不到的事情。我有一个包含此类数据的表(显示合成数据):

columnn1 | column2 | ...
------------------------
    A    |    1    |
    B    |    1    |
    C    |    2    |
    A    |    2    |
    D    |    3    |
    A    |    1    |
    B    |    1    |

我想要回来的是:

  1. 计算所有组合(例如,交叉连接)和
  2. 还包括组合发生的次数。
  3. 我知道如何使用简单的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。我也不关心列的排序顺序。我做了一些搜索,似乎无法在不生成和保存中间表的情况下找到方法。我可能只是忽视了一些愚蠢的事情。提前谢谢!

1 个答案:

答案 0 :(得分:1)

假设表中没有值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值非常简单,但需要更多逻辑。