很抱歉我迟到了几天,而且没有指定确切的表结构。请忽略上面的描述。我有更多的信息,所以我的原始问题不再有效,因为我获得了有关我真正需要的更多信息,如下所述:
我有下表(为了便于讨论,简化版)。第一行是标题:
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
将动态检索变量数。我不知道源表中有多少变量作为输入。
请告知。
答案 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