在tsql中使用Sum函数进行数据透视 [英] Pivoting with Sum function in tsql
问题描述
我有以下格式的数据
Client Business Unit Year Quarter USD Amt
BalckRock Pricing 2010 Q1 234
BalckRock Pricing 2010 Q2 343
BalckRock Pricing 2010 Q3 545
BalckRock Pricing 2010 Q4 5435
BalckRock Pricing 2011 Q1 5425
BalckRock Pricing 2011 Q2 3524
BalckRock Pricing 2011 Q3 54
BalckRock Pricing 2011 Q4 5425
BalckRock Pricing 2012 Q1 545
BalckRock Pricing 2012 Q2 5445
BalckRock Pricing 2012 Q3 545
BalckRock Pricing 2012 Q4 4545
BalckRock Sales 2010 Q1 23
BalckRock Sales 2010 Q2 3434
BalckRock Sales 2010 Q3 4234
BalckRock Sales 2010 Q4 4234
BalckRock Sales 2011 Q1 3423
BalckRock Sales 2011 Q2 1
BalckRock Sales 2011 Q3 1341
BalckRock Sales 2011 Q4 434
BalckRock Sales 2012 Q1 421
BalckRock Sales 2012 Q2 42
BalckRock Sales 2012 Q3 434
BalckRock Sales 2012 Q4 4214
我希望它具有以下格式
Client Business Unit 2010 2011 2012
BalckRock Pricing 6557 14428 11080
BalckRock Sales 11925 5199 5111
基本上,美元是每年的总和,但以年为列标题
Basically the sum of USD amnt year wise, but years as the column heading
有人可以帮我吗?
推荐答案
You can easily use a PIVOT for this. As the other have said you can use a Static Pivot that you code the columns that you want or you can use a Dynamic Pivot, which get the list of columns at run-time.
静态枢轴(请参见 Sql Fiddle for Demo )
select *
from
(
select client, businessunit, year, USD_Amount
from t
) x
pivot
(
sum(USD_Amount)
for year in ([2010], [2011], [2012])
) p
但是,为此,我可能会建议您使用动态Pivot,这样您在进入新的一年时就不必更改代码. (请参见带有演示的Sql Fiddle )
But for this, I might recommend a dynamic Pivot so you don't have to change you code when you get into a new year. (See Sql Fiddle with Demo)
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(year)
from t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT client, businessunit, ' + @cols + ' from
(
select client, businessunit, year, USD_Amount
from t
) x
pivot
(
sum(USD_Amount)
for year in (' + @cols + ')
) p '
execute(@query)
两个查询都将产生相同的结果.但是,动态枢轴的优势在于,当您拥有其他年份的数据时,则不必更新查询以包括这些字段.查询的第一部分获取表中的distinct years
列表,然后使用该years
列表确定您要查找的SUM
.
Both queries will produce the same results. However, the plus with the dynamic pivot is that when you have data from additional years, you will not have to update the query to include those fields. The first part of the query gets the list of the distinct years
in your table, it then uses that list of years
to determine the SUM
that you are looking for.
这篇关于在tsql中使用Sum函数进行数据透视的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!