[英]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
我正在引用 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;
結尾;
@xSqlStringPivot 只是制作元素列表(CustomFieldName0、CustomFieldName1 等)並將其連接到動態 SQL 字符串的一個小技巧,注意我在 while 塊中執行此操作,我只是將“CustomField”與當前迭代次數和進位進位(空格)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.