试图想出如何写一个动态的pivot sql语句.其中TEST_NAME最多可以有12个不同的值(因此有12列).一些VAL将是Int,Decimal或Varchar数据类型.我所看到的大多数例子都包括了一些.我正在寻找一个直观的枢纽.
Source Table ╔═══════════╦══════╦═══════╗ ║ TEST_NAME ║ SBNO ║ VAL ║ ╠═══════════╬══════╬═══════╣ ║ Test1 ║ 1 ║ 0.304 ║ ║ Test1 ║ 2 ║ 0.31 ║ ║ Test1 ║ 3 ║ 0.306 ║ ║ Test2 ║ 1 ║ 2.3 ║ ║ Test2 ║ 2 ║ 2.5 ║ ║ Test2 ║ 3 ║ 2.4 ║ ║ Test3 ║ 1 ║ PASS ║ ║ Test3 ║ 2 ║ PASS ║ ╚═══════════╩══════╩═══════╝ Desired Output ╔══════════════════════════╗ ║ SBNO Test1 Test2 Test3 ║ ╠══════════════════════════╣ ║ 1 0.304 2.3 PASS ║ ║ 2 0.31 2.5 PASS ║ ║ 3 0.306 2.4 NULL ║ ╚══════════════════════════╝
PIVOT功能需要聚合才能使其工作.看来你的VAL列是一个varchar,所以你必须使用MAX或MIN聚合函数.
如果测试次数有限,则可以对值进行硬编码:
select sbno,Test1,Test2,Test3 from ( select test_name,sbno,val from yourtable ) d pivot ( max(val) for test_name in (Test1,Test3) ) piv;
在您的OP中,您表示您将有更多的行转成列.如果是这样,那么可以使用动态sql:
DECLARE @cols AS NVARCHAR(MAX),@query AS NVARCHAR(MAX) select @cols = STUFF((SELECT distinct ',' + QUOTENAME(TEST_NAME) from yourtable FOR XML PATH(''),TYPE ).value('.','NVARCHAR(MAX)'),1,'') set @query = 'SELECT sbno,' + @cols + ' from ( select test_name,val from yourtable ) x pivot ( max(val) for test_name in (' + @cols + ') ) p ' execute(@query)
两个版本都会得到相同的结果:
| SBNO | TEST1 | TEST2 | TEST3 | --------------------------------- | 1 | 0.304 | 2.3 | PASS | | 2 | 0.31 | 2.5 | PASS | | 3 | 0.306 | 2.4 | (null) |
原文地址:https://www.jb51.cc/javaschema/281807.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。