T-SQL(联合国)数据透视表

时间:2014-06-17 10:44:22

标签: tsql sql-server-2008-r2 pivot unpivot

我有一个如下视图(做了一个视图,因为我认为访问更复杂的表会更容易)

ID | aText1 | aText2 | aInt1 | aInt2
-------------------------------------
1  | ABC1   | XYZ1   | 2     |  20
2  | ABC1   | XYZ2   | 3     |  25
3  | ABC2   | XYZ2   | 1     |  30
4  | ABC2   | XYZ1   | 4     |  35

我需要阅读结果

       | XYZ1          | XYZ2
aText1 | aInt1 | aInt2 | aInt1 | aInt2 
---------------------------------------
ABC1   | 2     | 20    | 3     | 25
ABC2   | 1     | 30    | 4     | 35

我尝试了各种各样的支点,但都失败了。 aText1aText2可以是任意数量的值。尽可能接近这个解决方案真的很有帮助

1 个答案:

答案 0 :(得分:1)

我通常使用动态sql。像这样的东西

create table #T
(
    ID int,
    aText1 varchar(4),
    aText2 varchar(4),
    aInt1 int,
    aInt2 int
)

insert into #T
select 1, 'ABC1', 'XYZ1', 2,  20
union
select 2, 'ABC1', 'XYZ2', 3,  25
union
select 3, 'ABC2', 'XYZ2', 1,  30
union
select 4, 'ABC2', 'XYZ1', 4,  35

declare @sql nvarchar(max)

set @sql = 'select aText1 '

select @sql = @sql + ', SUM(case when aText2 = ''' + aText2 + ''' then aInt1 end) as [' + aText2 + ' - aInt1] '+
                     ', SUM(case when aText2 = ''' + aText2 + ''' then aInt2 end) as [' + aText2 + ' - aInt2]'  
from 
(
    select distinct aText2 from #T
) T

set @sql = @sql + ' from #T group by aText1'

exec sp_executeSQL @sql

drop table #T

或者你可以创建另一个视图(比如我下一个例子中的#T2)并使用PIVOT

create table #T
(
    ID int,
    aText1 varchar(4),
    aText2 varchar(4),
    aInt1 int,
    aInt2 int
)

insert into #T
select 1, 'ABC1', 'XYZ1', 2,  20
union
select 2, 'ABC1', 'XYZ2', 3,  25
union
select 3, 'ABC2', 'XYZ2', 1,  30
union
select 4, 'ABC2', 'XYZ1', 4,  35

create table #T2
(
    aText1 varchar(4),
    aText2 varchar(20),
    aValue int
)

insert into #T2
select aText1, aText2 + ' - aInt1' as aText2, aInt1
from #T
union
select aText1, aText2 + ' - aInt2', aInt2 
from #T

declare @sql nvarchar(max), @columns nvarchar(max)
set @columns = ''
select @columns = @columns + ', [' + aText2 + ']'
from (select distinct aText2 from #T2) as T

set @columns = substring(@columns, 2, len(@columns))

set @sql = 
    '
        SELECT *
        FROM
        (SELECT 
                aText1, 
                aText2, 
                aValue 
            FROM 
                #T2 
        ) AS SourceTable
        PIVOT
        (
            SUM(aValue)
            FOR aText2 in ('+@columns+')
        ) AS PivotTable'

exec sp_executeSQL @SQL

drop table #T2
drop table #T