【问题标题】:SQL - GROUP BY all possible variablesSQL - GROUP BY 所有可能的变量
【发布时间】:2019-11-02 07:12:25
【问题描述】:

我一直在寻找一种方法来做到这一点,但我似乎找不到解决方案。

如何在不从第 2 列删除所有可能的变量的情况下选择和分组,其中第 1 列的变量不存在变量?

数据示例(左)- 我希望它如何(中)- 当前(右)

当我这样做时:


SELECT Column1, Column2, COUNT(*) 
FROM Table
GROUP BY Column1, Column2;

如果我要使用这行代码,我将无法查看 column2 中针对 column1 的每个变量的所有变量(我希望如此)。因为如果它们不存在,它就不会显示在结果中。

所以我想查看 Column1 中的所有变量以及 Column2 中的所有 4 个可能变量,然后计算该组合存在的数量。

提前感谢您的帮助,希望我的问题很清楚。

【问题讨论】:

  • 该表中有多少行,每列有多少不同的值?
  • 表中有很多行。认为这并不重要,因为它只是示例的倍数。
  • 基本上超过 100.000 行。

标签: sql teradata


【解决方案1】:

我想你想要一个cross join,然后是left join 和聚合:

select c1.column1, c2.column2, count(t.column1)
from (select distinct column1 from t) c1 cross join
     (select distinct column2 from t) c2 left join
     t
     on t.column1 = c1.column1 and t.column2 = c2.column2
group by c1.column1, c2.column2;

【讨论】:

    【解决方案2】:

    根据 distict 组合的数量和表中的行数以及每个组合,使用现有的 Select 并使用返回所有可能组合的 Cross Join 扩展它可能会更有效(类似于 Gordon 的技术,但聚合之前然后加入):

    SELECT Column1, Column2, Sum(Cnt)
    FROM
     (
       -- existing combinations
       SELECT Column1, Column2, Count(*) AS Cnt
       FROM mytable
       GROUP BY Column1, Column2
    
       UNION ALL
    
       -- all combinations
       SELECT c1.column1, c2.column2, 0 AS Cnt
       FROM (SELECT DISTINCT column1 FROM myTable) c1 CROSS JOIN
            (SELECT DISTINCT column2 FROM tmyTable) c2
     ) AS dt
    GROUP BY 1,2 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      相关资源
      最近更新 更多