我有一个生成数百万行和数十列的查询。我已经发布了原始查询的图片,它是我正在使用的内容的简化版本,名为“Details”。
我需要将“Description”列中的每一行/值转置为单独的列,并将这些列:CountValue、AmountA 和 AmountB 转置为 3 个单独的表,每个表都有自己的“Description”列' 柱子。最后我需要将它们全部加入一张表中。
这是原始表格详细信息:
我已将“Description”中的每个值转置到各自的列中,并将“CountValue”转置在一列下,并用它填充每一行。这是表
计数:
在这里我对 AmountA 做了同样的事情。这是表
AmtA:
对表
AmtB进行了相同的转置:
最后将它们全部加入表
AmountCount中,这就是我的最终输出:
有几点需要注意:
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 语句进行转置的建议。我的另一个问题是关于合并所有转置表。假设每个表中都存在的列
CountsA 和 CountsB 是键。在最终表中,如果我将所有必需的列保留在 select 中,然后在表 Counts、AmtA 和 AmtB 之间进行内部联接 CountsA 和 CountsB 可以吗?
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
注释