T-SQL Pivot行到列

时间:2016-04-24 16:39:54

标签: sql sql-server tsql pivot

我正在使用SQL Server 2012并且有一个包含以下列的表:

ID,Date,CustomFieldName,CustomFieldValue

CustomFieldName列有100个值(我知道这听起来有多愚蠢)但是为了简单起见,我们说它们是CustomField1,CustomField2,CustomField3

我想创建一个出口看起来像

的枢轴

ID,Date,CustomField1,CustomField2,CustomField3,其中聚合了CustomFieldVaue的最大日期。

我在这方面做得非常糟糕,但取得了一些进展(尽管我的最大值并不正确并且收到了大量错误数据)

任何帮助将不胜感激!

SELECT [date],[id], [CustomField1], [CustomField2], [CustomField3]
from
(
  SELECT [date], [id], [CustomFieldValue], [CustomFieldName], 
    row_number() over(partition by [CustomFieldName] order by [CustomFieldValue]) rn
  from CustomTable
) as st
pivot
(
  max([CustomFieldValue])
  FOR [CustomFieldName] in ([CustomField1], CustomField2, [CustomField3])
) as pivottable
order by [id]

1 个答案:

答案 0 :(得分:1)

希望我做对了,你想把行(COlumnName1,2,...等)作为列进行转动,所以我已经制作了一个可以运行的小脚本。

我建议使用CTE进行透视,使其更容易,如果您想查看查询的整个结构,只需执行select @xSqlString

set nocount on;

create table 
    #testTable 
        (
            ID                  int identity(1,1),
            [Date]              datetime default getdate(),
            CustomFieldName     nvarchar(50),
            CustomFieldValue    date
        );

declare
    @i int = 0,
    @xSqlStringPivot  nvarchar(max) = '',
    @xSqlString       nvarchar(max) = '';

while(@i<=100)
begin

set
    @xSqlStringPivot += concat('CustomFieldName',cast(@i as nvarchar(50)),char(13), case when @i<100 then ', ' else '' end);

insert into #testTable
    (
        CustomFieldName,
        CustomFieldValue
    )
values
    (
        concat('CustomFieldName', cast(@i as nvarchar(50))),
        dateAdd(day,-@i,getdate())
    );

set
    @i += 1;

end;


select * from
    #testTable


set
    @xSqlString = 
        (
            'with ctePiv as
            (
            select
                t.CustomFieldName,
                t.CustomFieldValue
            from
                #testTable t
            )
            select
                *
            from
                ctePiv
            pivot
            (
                max(customFieldValue) for customFieldName in
                    (
                    '+ @xSqlStringPivot +'          
                    )
            )p'
        );

exec sp_executeSQL @xSqlString


drop table #testTable;

修改1

  1. 我在while块上引用自定义表,基本上我迭代100次以填充100行的表。这只是为了模拟你的情况。

    而(@ I&LT; = 100) 开始

    组     @xSqlStringPivot + = concat(&#39; CustomFieldName&#39;,cast(@i as nvarchar(50)),char(13),@ i&lt; 100然后&#39;&#39; else&#的情况39;&#39;结束);

    插入#testTable     (         CustomFieldName,         CustomFieldValue     ) 值     (         concat(&#39; CustomFieldName&#39;,cast(@i as nvarchar(50))),         DATEADD(天, - @我,GETDATE())     );

    组     @i + = 1;

    端;

  2. @xSqlStringPivot只是制作元素列表(CustomFieldName0,CustomFieldName1等)并将其连接到动态SQL字符串的一个小技巧,请注意我在while块中执行此操作,我只是连接了#CustomField&#39;使用当前的迭代编号和进位进给(空格)。