Применить оператор PIVOT несколько раз в одном столбце - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть следующая структура таблицы:

enter image description here

И нужны данные в следующем формате:

enter image description here

Но результат следующий:

enter image description here

Мой код:

SELECT * FROM (
  SELECT
    record, 
    field AS real_field,
    real_value,
    field AS string_field,
    string_value 
  FROM my_table ) AS source
PIVOT ( MAX(string_value) FOR string_field IN ([1],[2],[3],[4]) ) AS string_pivot
PIVOT ( MAX(real_value) FOR real_field IN ([5],[6]) ) AS real_pivot;

Есть идеи?Спасибо.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Ну, это было на самом деле проще, чем я думал:

SELECT record, MAX([1]), MAX([2]), MAX([3]), MAX([4]), MAX([5]), MAX([6]) FROM ( SELECT record, field AS real_field, real_value, field AS string_field, string_value FROM my_table ) AS source
PIVOT ( MAX(string_value) FOR string_field IN ([1],[2],[3],[4]) ) AS string_pivot
PIVOT ( MAX(real_value) FOR real_field IN ([5],[6]) ) AS real_pivot
GROUP BY record;
0 голосов
/ 25 апреля 2018

Вы могли бы просто использовать коалесцию, нет?

DECLARE @test TABLE(record INT,
field INT,
real_value DECIMAL NULL,
string_value VARCHAR(10) NULL);
INSERT INTO @test(record, field, real_value, string_value)
VALUES(1, 1, NULL, 'A'),
    (1, 2, NULL, 'B'),
    (1, 3, NULL, 'C'),
    (1, 4, NULL, 'D'),
    (1, 5, 1.0, NULL),
    (1, 6, 2.0, NULL);


SELECT *
FROM(
    SELECT record, field, COALESCE(CONVERT(VARCHAR(10), real_value, 0), string_value) AS value
    FROM @test
    ) AS source
PIVOT(MAX(value)
      FOR field IN([1], [2], [3], [4], [5], [6])
     ) AS real_pivot;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...