仅使用 Case 语句将列转为行并连接所有表

问题描述 投票:0回答:1

我有一个生成数百万行和数十列的查询。我已经发布了原始查询的图片,它是我正在使用的内容的简化版本,名为“Details”。

我需要将“Description”列中的每一行/值转置为单独的列,并将这些列:CountValueAmountAAmountB 转置为 3 个单独的表,每个表都有自己的“Description”列' 柱子。最后我需要将它们全部加入一张表中。

这是原始表格

详细信息

Table Details

我已将“Description”中的每个值转置到各自的列中,并将“CountValue”转置在一列下,并用它填充每一行。这是表

计数

Table Counts

在这里我对 AmountA 做了同样的事情。这是表

AmtA

AmtA

对表

AmtB进行了相同的转置:

AmtB

最后将它们全部加入表

AmountCount中,这就是我的最终输出:

AmountCount

有几点需要注意:

    我只能使用case语句和聚合函数。我无法使用pivot函数或其他更复杂的函数。
  • 上面的表格只是我实际想要使用的示例,其中包含数百万行和大量列。
  • 我希望所有转置的表格以及结果表格的顺序与原始表格相同。
我尝试转置 Counts 表中的 CountValue 和 Description 列的查询位于此处:

with Counts as ( select distinct t1.CountsA, t1.CountsB, t1.CountsC t1.CountsD, ('CountValue') as ColCountE, sum(case when Description = 'Arizona' then t1.CountValue end) as ColArizona, sum(case when Description = 'California ' then t1.CountValue end) as ColCalifornia, sum(case when Description = 'Florida' then t1.CountValue end) as ColFlorida, sum(case when Description = 'Iowa' then t1.CountValue end) as ColIowa, sum(case when Description = 'Kansas ' then t1.CountValue end) as ColKansas, sum(case when Description = 'Kentucky' then t1.CountValue end) as ColKentucky from Details t1 group by t1.CountsA, t1.CountsB, t1.CountsC t1.CountsD, CountValue ) SELECT * from Counts
我尝试了各种分组依据组合,包括上述组合,但没有得到所需的结果。如果有人可以提供正确的代码,我们将不胜感激。这是我需要的主要代码,任何使用 case 语句进行转置的建议。

我的另一个问题是关于合并所有转置表。假设每个表中都存在的列

CountsACountsB 是键。在最终表中,如果我将所有必需的列保留在 select 中,然后在表 CountsAmtAAmtB 之间进行内部联接 CountsACountsB 可以吗?

sql snowflake-cloud-data-platform case transpose rdbms
1个回答
0
投票
运行 3 个不同的查询然后连接这些结果的效率并不高,只需不断添加更多

case 表达式 来覆盖所有金额列即可。因此,您不需要在 select 子句中使用 ('CountValue') as ColCountE

 (或类似的),因为所有数字列都可以在一个查询中满足,并且列名称暗示数据源。 (您可能需要重新审视列的命名以使其更加清晰。)

SELECT t1.CountsA , t1.CountsB , t1.CountsC , t1.CountsD /* CountValue */ , sum(CASE WHEN Description = 'Arizona' THEN t1.CountValue END) AS ColArizona , sum(CASE WHEN Description = 'California ' THEN t1.CountValue END) AS ColCalifornia , sum(CASE WHEN Description = 'Florida' THEN t1.CountValue END) AS ColFlorida , sum(CASE WHEN Description = 'Iowa' THEN t1.CountValue END) AS ColIowa , sum(CASE WHEN Description = 'Kansas ' THEN t1.CountValue END) AS ColKansas , sum(CASE WHEN Description = 'Kentucky' THEN t1.CountValue END) AS ColKentucky /* AmountA */ , sum(CASE WHEN Description = 'Arizona' THEN t1.AmountA END) AS Arizona_A , sum(CASE WHEN Description = 'California ' THEN t1.AmountA END) AS California_A , sum(CASE WHEN Description = 'Florida' THEN t1.AmountA END) AS Florida_A , sum(CASE WHEN Description = 'Iowa' THEN t1.AmountA END) AS Iowa_A , sum(CASE WHEN Description = 'Kansas ' THEN t1.AmountA END) AS Kansas_A , sum(CASE WHEN Description = 'Kentucky' THEN t1.AmountA END) AS Kentucky_A /* AmountB */ , sum(CASE WHEN Description = 'Arizona' THEN t1.AmountB END) AS Arizona_B , sum(CASE WHEN Description = 'California ' THEN t1.AmountB END) AS California_B , sum(CASE WHEN Description = 'Florida' THEN t1.AmountB END) AS Florida_B , sum(CASE WHEN Description = 'Iowa' THEN t1.AmountB END) AS Iowa_B , sum(CASE WHEN Description = 'Kansas ' THEN t1.AmountB END) AS Kansas_B , sum(CASE WHEN Description = 'Kentucky' THEN t1.AmountB END) AS Kentucky_B FROM Details t1 GROUP BY t1.CountsA , t1.CountsB , t1.CountsC , t1.CountsD

注释

    在聚合函数内使用
  • case 表达式 称为“条件聚合”
  • group by
    子句将从您在该子句中指定的列形成唯一的行,
    select distinct
    还测试所有行是否唯一定义 - 因此如果已经使用
    group by
    ,则它是多余的。
  • 不要包含需要聚合到
  • group by
     子句中的列,您包含的列有时称为“非聚合”列
  • 您问题的 SQL 中缺少 2 个逗号,这就是我更喜欢上面看到的布局的原因。在
  • PoorSQL 尝试一下
© www.soinside.com 2019 - 2024. All rights reserved.