TSQL透视单个列表

时间:2012-06-29 17:19:57

标签: tsql pivot

很抱歉我迟到了几天,而且没有指定确切的表结构。请忽略上面的描述。我有更多的信息,所以我的原始问题不再有效,因为我获得了有关我真正需要的更多信息,如下所述:

我有下表(为了便于讨论,简化版)。第一行是标题:

VariableID  DocumentID  Revision  Value
44          12          2         Val1
45          12          2         Val2
45          12          3         Val3
44          13          1         Val4
46          13          2         Val5
47          14          1         Val6

我想将它(假设n行数)转换为以下分组的(DocumentId,revision)表:

Documentid  revision  variable1 (44)  variable2 (45)  variable3(46)  variable(47)  variable (n)
12          2         Val1            Val2            null           null
12          3         null            Val3            null           null
13          1         Val4            null            null           null
13          2         null            null            Val5           null
14          1         null            null            null           Val6

将动态检索变量数。我不知道源表中有多少变量作为输入。

请告知。

2 个答案:

答案 0 :(得分:1)

您没有提供有关当前表结构或示例数据的大量详细信息。因此,我将向您提供将执行此操作的PIVOT函数的一些示例。

PIVOT有两个选项,如果您知道要转换的列数,则为静态;如果您知道将在运行时获取列的列表以进行转换,则为静态。

编辑: 根据您的问题的更改,您仍然可以执行PIVOT

Static Pivot看起来像这样(Sql Fiddle sample):

select *
from 
(
  select *
  from t
) x
pivot 
(
  max(value)
  for variableid in([44], [45], [46], [47])
) p

动态Pivot看起来像这样(Sql Fiddle Sample):

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

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

SELECT @colsAlias = STUFF((SELECT DISTINCT ',' + QUOTENAME(m.variableid) + ' AS ' + QUOTENAME('variable' + cast(n.variableid as varchar(10)))  
    FROM t m INNER JOIN t n ON m.variableid = n.variableid
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')


set @query = 'SELECT documentid, revision, ' + @colsAlias + ' from 
             (
                select *
                from t
            ) x
            pivot 
            (
                max(value)
                for variableid in (' + @cols + ')
            ) p '

execute(@query)

答案 1 :(得分:0)

PIVOT操作员听起来就像你在寻找它,它可以在Microsoft SQL Server和Microsoft Access中使用,但我不确定它是否在Sybase中可用。以下是关于它的MSDN文章:T-SQL Pivot Operator