将列转换为列,不使用聚合
发布时间:2020-12-14 00:47:16 所属栏目:百科 来源:网络整理
导读:试图想出如何写一个动态的pivot sql语句.其中TEST_NAME最多可以有12个不同的值(因此有12列).一些VAL将是Int,Decimal或Varchar数据类型.我所看到的大多数例子都包括了一些.我正在寻找一个直观的枢纽. Source Table ╔═══════════╦══════╦
试图想出如何写一个动态的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; 见SQL Fiddle with Demo. 在您的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) 见SQL Fiddle with Demo. 两个版本都会得到相同的结果: | SBNO | TEST1 | TEST2 | TEST3 | --------------------------------- | 1 | 0.304 | 2.3 | PASS | | 2 | 0.31 | 2.5 | PASS | | 3 | 0.306 | 2.4 | (null) | (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |