【问题标题】:SQL complex dynamic PivotingSQL复杂动态透视
【发布时间】:2013-10-24 18:49:32
【问题描述】:

您好,我正在 SQL Server 中尝试对下表进行透视

REFID | COL1 | COL2 | Sequence
1       abc    cde     1
1       lmn    rst     2
1       kna    asg     3
2       als    zkd     2
2       zpk    lad     1

我希望输出为

   COLNAME REFID | 1 | 2 | 3
     COL1   1     abc lmn kna
     COL2   1     cde rst asg
     COL1   2     zpk als null
     COL2   2     lad zkd null

原始表中的列数已知,但行数未知。谁能帮忙

【问题讨论】:

  • 哪个数据库?你为此做了什么?
  • 我仍然是 sql 的初学者,我搜索了旋转语法,但我没有找到任何将列一次又一次地作为行作为多个 refID 的语法
  • 在 sql server 2005 中

标签: sql sql-server sql-server-2005 pivot


【解决方案1】:

为了获得最终结果,您可以使用 PIVOT 函数,但首先我会取消转置您的 col1col2 列,这样您就不会有多个列需要转置。

如果您的列数有限,则可以对查询进行硬编码:

select REFID, col, [1], [2], [3]
from 
(
    select REFID, Sequence, col, value
    from yourtable
    cross apply
    (
        select 'COL1', col1 union all
        select 'COL2', col2
    ) c (col, value)
) d
pivot
(
    max(value)
    for sequence in ([1], [2], [3])
) piv
order by refid;

但如果你有未知数量的sequence 值,那么你可以使用动态 SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(sequence) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT refid, col,' + @cols + ' 
            from 
            (
                select REFID, Sequence, col, value
                from yourtable
                cross apply
                (
                    select ''COL1'', col1 union all
                    select ''COL2'', col2
                ) c (col, value)
            ) x
            pivot 
            (
                max(value)
                for Sequence in (' + @cols + ')
            ) p 
            order by refid'

execute sp_executesql @query;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多