Поворот неравномерного числа значений столбцов в сгруппированные строки - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть таблица этой структуры:

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

(без точек, конечно).

Прежде чем сделать это, я могу определить максимальное количество значений, которое имеет человек, поэтому я могу заранее «назвать» столбцы, но мне нужно иметь возможность заполнить все данные заполнением пробелами или нулями - это нормально. .

Я посмотрел другие ответы, но не смог найти пример неравномерного числа значений для каждой создаваемой строки.

1 Ответ

0 голосов
/ 29 апреля 2020

В приведенном ниже коде используются 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

Result Set

+------+--------+--------+--------+
| Name | value1 | value2 | value3 |
+------+--------+--------+--------+
| Fred |     11 | 12     | 13     |
| Jim  |     21 | 22     | NULL   |
| John |     31 | NULL   | NULL   |
+------+--------+--------+--------+
...