簡體   English   中英

T-SQL 透視行到列

[英]T-SQL Pivot Row to Column

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

ID、日期、自定義字段名稱、自定義字段值

CustomFieldName 列有 100 個值(我知道這聽起來多么愚蠢)但為了簡單起見,我們可以說它們是 CustomField1、CustomField2、CustomField3

我想創建一個輸出看起來像的支點

ID、日期、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]

希望我做對了,您想將行(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 行填充表。 這只是為了模擬你的情況。

    while(@i<=100) 開始

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

    插入 #testTable ( CustomFieldName, CustomFieldValue ) 值 ( concat('CustomFieldName', cast(@i as nvarchar(50))), dateAdd(day,-@i,getdate()) );

    設置@i += 1;

    結尾;

  2. @xSqlStringPivot 只是制作元素列表(CustomFieldName0、CustomFieldName1 等)並將其連接到動態 SQL 字符串的一個小技巧,注意我在 while 塊中執行此操作,我只是將“CustomField”與當前迭代次數和進位進位(空格)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM