TSql复杂枢轴

TSql复杂枢轴,第1张

TSql复杂枢轴

是的,可以使用PIVOT函数完成此 *** 作,我首先建议您查看查询的硬编码版本,以便在移至动态版本的查询之前可以查看查询的编写方式。

静态版本将类似于以下内容:

select [Level1 - User1], [Level2 - User2], [Level3 - User3]from(  select 'Level'+cast(level as varchar(1)) + ' - '+ [user] col,     convert(varchar(10), date, 101) +' - '+ action value,    row_number() over(partition by level order by [user], date) rn  from yt) dpivot(  max(value)  for col in ([Level1 - User1], [Level2 - User2], [Level3 - User3])) piv;

参阅带有演示的SQL
Fiddle
。您会注意到,

level
and
user
列被串联以创建新列,而
date
and和
action
被串联以为每个列创建值。我还添加了
row_number()
一个为每一行创建一个唯一值,当您在PIVOT中应用聚合函数时,这一点很重要。如果您不使用它,那么结果将只有一行。

由于您现在有了工作版本,因此可以轻松将其转换为动态版本:

DECLARE @cols AS NVARCHAr(MAX),    @query  AS NVARCHAr(MAX)select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Level'+cast(level as varchar(1)) + ' - '+ [user])          from yt FOR XML PATH(''), TYPE ).value('.', 'NVARCHAr(MAX)')         ,1,1,'')set @query = 'SELECt ' + @cols + ' from   (     select ''Level''+cast(level as varchar(1)) + '' - ''+ [user] col,        convert(varchar(10), date, 101) +'' - ''+ action value,       row_number() over(partition by level order by [user], date) rn     from yt ) x pivot  (     max(value)     for col in (' + @cols + ') ) p 'execute(@query);

请参阅带有演示的SQL Fiddle。两者的结果是:

|       LEVEL1 - USER1 |       LEVEL2 - USER2 |        LEVEL3 - USER3 |-----------------------------------------------------------------------| 01/01/2013 - Approve | 02/01/2013 - Approve | 03/01/2013 - Rejected || 04/01/2013 - Approve | 05/01/2013 - Approve |  06/01/2013 - Approve |


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5566130.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存