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