-2

表中的当前数据

id  AA  BB  CC  DD  EE  FF
1   a   b   c   d   e   f
2   a1  b2  c3  d2  e4  f2

我想:

Colx   1   2
AA     a   a1 
BB     b   b2
CC     c   c3
DD     d   d2 
EE     e   e4 
FF     f   f2

请帮我。

4

1 回答 1

2

好吧,仔细查看您的问题后,我认为这不是重复的,您不仅要将列转换为行,还想同时将行转换为列。
因此,您必须结合两种解决方案 - 将列转为行并将行转为列,例如:

select
    c.name as ColX,
    max(case when t.id = 1 then c.value else null end) as [1],
    max(case when t.id = 2 then c.value else null end) as [2]
from Table1 as t
    cross apply (values
        ('AA', t.AA),
        ('BB', t.BB),
        ('CC', t.CC),
        ('DD', t.EE)
     ) as c(name, value)
group by c.name

sql fiddle demo

您还可以使用SQL Server 中的标准数据透视和反透视

select *
from Table1 as t
unpivot (
    value for
    colx in (AA, BB, CC, DD, EE, FF)
) as unpiv
pivot (
    max(unpiv.value)
    for id in ([1], [2])
) as piv

sql fiddle demo

如果您不想指定 id 和列的值,请尝试动态 SQL:

declare @stmt1 nvarchar(max), @stmt2 nvarchar(max), @stmt nvarchar(max)

select @stmt1 =
    isnull(@stmt1 + ', ', '') + 
    '(''' + c.column_name + ''', t.' + c.column_name + ')'
from information_schema.columns as c
where c.table_name = 'Table1' and c.column_name <> 'id'

select @stmt2 =
    isnull(@stmt2 + ', ', '') + 'max(case when t.id = ' + t.id + ' then c.value end) as [' + t.id + ']'
from (select distinct cast(id as nvarchar(max)) as id from Table1) as t

select @stmt = '
    select
        c.name as ColX, ' + @stmt2 + '
    from Table1 as t
        cross apply (values ' + @stmt1 + ') as c(name, value)
    group by c.name'

exec sp_executesql @stmt = @stmt

sql fiddle demo

于 2013-08-19T09:19:56.200 回答