我有以下格式的数据
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
基本上美元的总和是年度明智,但年份为列标题
有人可以帮助我吗?
答案 0 :(得分:5)
有不同的方法,您可以使用PIVOT
(静态或动态,具体取决于您的需要),或者只需使用CASE
:
SELECT Client,
[Business Unit],
SUM(CASE WHEN [Year] = 2010 THEN [USD Amt] ELSE 0 END) [2010],
SUM(CASE WHEN [Year] = 2011 THEN [USD Amt] ELSE 0 END) [2011],
SUM(CASE WHEN [Year] = 2012 THEN [USD Amt] ELSE 0 END) [2012]
FROM YourTable
GROUP BY Client, [Business Unit]
使用PIVOT
:
SELECT *
FROM ( SELECT Client, [Business Unit], [USD Amt], [Year]
FROM YourTable) T
PIVOT (SUM([USD Amt]) FOR [Year] IN ([2010],[2011],[2012])) PT
答案 1 :(得分:5)
您可以轻松使用PIVOT。正如其他人所说,您可以使用静态数据透视表来编写所需的列,也可以使用动态数据透视表,它可以在运行时获取列列表。
Static Pivot(参见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 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
。
答案 2 :(得分:0)
- 包含一行五列的数据透视表
SELECT Client Business Unit Year Quarter USD Amt,[2010],[2011],[2012]
FROM
(SELECTClient Business Unit Year Quarter USD Amt
FROM Table) AS SourceTable
PIVOT
(
sum(USD Amt)
FOR Year IN ([2010], [2011], [2012])
) AS PivotTable;