将数量不均匀的列值透视成分组的行

时间:2020-04-29 00:16:40

标签: sql-server-2012

我有一个具有这种结构的表:

Fred    Jim   John    
11......21....31    
12......22....null    
13......null...null

我想转向这种结构:

Name    Value1  Value2  Value3    
Fred.....11.........12.........13    
Jim.......21........ 22.........null    
John.....13.........null........null

(当然没有点)。

在执行此操作之前,我可以确定一个人拥有的最大值数,因此可以“命名” 列,但是我需要能够容纳所有数据-用空格或null填充是可以的。

我看了其他答案,但是找不到要创建的每一行的数值不均匀的示例。

1 个答案:

答案 0 :(得分:0)

下面的代码使用OUTER APPLY和排名函数来获得结果。

DECLARE @persons TABLE(Fred int,Jim int,John int)

INSERT INTO @persons
VALUES(11,21,31),(12,22,null),(13,null,null)

SELECT  t.Name
        , Max(CASE WHEN t.rnk = 1 THEN t.value END) AS value1
        , Max(CASE WHEN t.rnk = 2 THEN t.value END) AS value2
        , Max(CASE WHEN t.rnk = 3 THEN t.value END) AS value3
FROM (
    SELECT Fred, Jim, John, Row_Number() OVER ( ORDER BY ( SELECT NULL)) AS rnk
    FROM @persons
    ) AS p
OUTER APPLY (
    VALUES ('Fred', Fred, rnk), ('Jim', Jim, rnk), ('John', John, rnk)
    ) AS t(Name, Value, rnk)
GROUP BY Name

结果集

+------+--------+--------+--------+
| Name | value1 | value2 | value3 |
+------+--------+--------+--------+
| Fred |     11 | 12     | 13     |
| Jim  |     21 | 22     | NULL   |
| John |     31 | NULL   | NULL   |
+------+--------+--------+--------+
相关问题