我有一个具有这种结构的表:
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填充是可以的。
我看了其他答案,但是找不到要创建的每一行的数值不均匀的示例。
答案 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 |
+------+--------+--------+--------+