sqlserver-使用pivot将多行合并为一行
假设我们有下表:sqlserver-使用pivot将多行合并为一行,sql,sql-server,pivot,Sql,Sql Server,Pivot,假设我们有下表: ID Type Amount 0001 A 10 0001 B 20 0001 C 30 0002 A 15 0002 C 20 0003 B 40 ... 预期结果将是: ID Type A Type B Type C 0001 10 20 30 为了将多行合并为一行,我可以执行以下
ID Type Amount
0001 A 10
0001 B 20
0001 C 30
0002 A 15
0002 C 20
0003 B 40
...
预期结果将是:
ID Type A Type B Type C
0001 10 20 30
为了将多行合并为一行,我可以执行以下操作
SELECT ID, A, B, C
FROM MyTable
PIVOT
(
SUM(amount)
FOR Type IN (A, B, C)
) AS P
然而,我的表格比上一张更复杂。
假设我的表如下所示:
ID Type Total_Amount Average_Amount
0001 A 10 0.5
0001 B 20 0.7
0001 C 30 0.9
所以我的问题是如何产生以下结果?
ID TypeA_total TypeB_total TypeC_total TypeA_avg TypeB_avg TypeC_avg
0001 10 20 30 0.5 0.7 0.9
更新:
您需要在
旋转之前取消PIVOT
数据
WITH cte
AS (SELECT id,
value,
col_name
FROM yourtable
CROSS apply( VALUES (total_amount,'Type' + type + '_Total'),
(average_amount,'Type' + type + '_Avg') )
CS (value, col_name))
SELECT *
FROM cte
PIVOT (Max(value)
FOR col_name IN([TypeA_total],[TypeB_total],[TypeC_total],
[TypeA_avg],[TypeB_avg],[TypeC_avg]))pv
注意:如果类型的数量未知,则需要使用动态sql
以下是另一种方法。这是使用交叉表查询而不是透视。我发现语法没有那么迟钝,甚至比使用PIVOT有轻微的性能提升
if OBJECT_ID('tempdb..#something') is not null
drop table #something
create table #something
(
ID char(4)
, SomeType char(1)
, Amount int
, AverageAmount decimal(9, 2)
)
insert #something
select '0001', 'A', 10, .5 union all
select '0001', 'B', 20, .7 union all
select '0001', 'C', 30, .9;
with OrderedResults as
(
select *
, ROW_NUMBER() over(partition by ID order by SomeType) as RowNum
from #something
)
select ID
, MAX(Case when RowNum = 1 then SomeType end) as TypeA
, MAX(Case when RowNum = 1 then AverageAmount end) as AverageA
, MAX(Case when RowNum = 2 then SomeType end) as TypeB
, MAX(Case when RowNum = 2 then AverageAmount end) as AverageB
, MAX(Case when RowNum = 3 then SomeType end) as TypeC
, MAX(Case when RowNum = 3 then AverageAmount end) as AverageC
from OrderedResults
group by ID
类型的数量是固定的吗?你需要求平均数的平均值还是求和?第一个表显示了总金额,而第一个表只显示了金额,您将其相加。对于第二个查询,您是在处理已聚合的结果还是没有?@TomH请查看更新我单独运行第一个select语句,然后首先查看结果。现在,我想我理解了你在这里所说的“先解压”数据,然后再进行数据透视的意思。