试图想出如何写一个动态的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) |