[英]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.