将列转换为列,不使用聚合

前端之家收集整理的这篇文章主要介绍了将列转换为列,不使用聚合前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
试图想出如何写一个动态的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) |

猜你在找的设计模式相关文章