有几种不同的方法可以获得结果,通过使用带有 CASE 表达式的聚合函数,使用 PIVOT 函数 - 但在实施这些方法之前,您首先需要查看对多列数据进行反透视 - @ 987654325@、AMC2、AMC3。
反透视的过程将您的多列转换为行。可以使用 unpivot 函数,也可以使用CROSS APPLY 转换数据:
select qtr, year, bu, bu_description, p2a_line,
lob, value
from yourtable
cross apply
(
select 'amc1', amc1 union all
select 'amc2', amc2 union all
select 'amc3', amc3
) c (lob, value);
见SQL Fiddle with Demo。一旦数据采用这种格式,您就可以将 P2A_Line 值转换为列。
使用带有 CASE 表达式的聚合函数,查询将是:
select qtr, year, bu, bu_description,
lob,
max(case when p2a_line = 'L1_1' then value end) L1_1,
max(case when p2a_line = 'L1_2' then value end) L1_2,
max(case when p2a_line = 'L1_3' then value end) L1_3
from
(
select qtr, year, bu, bu_description, p2a_line,
lob, value
from yourtable
cross apply
(
select 'amc1', amc1 union all
select 'amc2', amc2 union all
select 'amc3', amc3
) c (lob, value)
) d
group by qtr, year, bu, bu_description, lob;
见SQL Fiddle with Demo。
在 SQL Server 2005+ 中,您可以使用 PIVOT 函数:
select qtr, year, bu, bu_description,
lob, L1_1, L1_2, L1_3
from
(
select qtr, year, bu, bu_description, p2a_line,
lob, value
from yourtable
cross apply
(
select 'amc1', amc1 union all
select 'amc2', amc2 union all
select 'amc3', amc3
) c (lob, value)
) d
pivot
(
max(value)
for p2a_line in (L1_1, L1_2, L1_3)
) piv;
见SQL Fiddle with Demo。
最后,如果您有未知数量的 p2a_line 值,那么您可以使用动态 SQL:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(P2A_Line)
from yourtable
group by P2A_Line
order by P2A_Line
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'SELECT qtr, year, bu, bu_description, lob,' + @cols + N'
from
(
select qtr, year, bu, bu_description, p2a_line,
lob, value
from yourtable
cross apply
(
select ''amc1'', amc1 union all
select ''amc2'', amc2 union all
select ''amc3'', amc3
) c (lob, value)
) x
pivot
(
max(value)
for p2a_line in (' + @cols + N')
) p '
execute sp_executesql @query;
见SQL Fiddle with Demo
所有版本都给出结果:
| QTR | YEAR | BU | BU_DESCRIPTION | LOB | L1_1 | L1_2 | L1_3 |
|-----|------|--------|----------------|------|------|--------|--------|
| Q3 | 2013 | B52100 | 52100 - UFC | amc1 | 203 | (null) | 123 |
| Q3 | 2013 | B52100 | 52100 - UFC | amc2 | 17 | (null) | 113 |
| Q3 | 2013 | B52100 | 52100 - UFC | amc3 | 7 | (null) | (null) |