0

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

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

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

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

请指教。

4

2 回答 2

1

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

PIVOT 有两个选项,一个静态(如果您知道要转换的列数)或一个动态,它将在运行时获取要转换的列列表。

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

静态枢轴看起来像这样(Sql Fiddle 示例):

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

由于动态枢轴看起来像这样(Sql Fiddle 示例):

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)
于 2012-06-29T17:32:34.240 回答
0

PIVOT 运算符听起来就像您正在寻找的那样,它在 Microsoft SQL Server 和 Microsoft Access 中都可用,但我不确定它是否在 Sybase 中可用。这是关于它的 MSDN 文章:T-SQL Pivot Operator

于 2012-06-29T17:24:41.050 回答