У меня есть записи в SQL (Server), которые я пытаюсь представить в удобочитаемом виде, но это не получается ...
Я использую оператор case, чтобы перенести значения полей в отдельные поля, но получаю ступеньку в результатах. Необработанные строки выглядят так:

w x y z a 
w x y z b 
w x y z c 


Используя оператор case, я придумываю:

w x y z a     null  null 
w x y z null  b     null
w x y z null  null  c 

Я пытаюсь получить одну строку для этих трех записей, например:

w x y z a b c 

Ссылка на скрипт SQL
Я много раз искал, но думаю, что просто не использую правильное слово для описания проблемы ... Любое направление будет оценено. Заранее спасибо.

2
NoTheOtherFry 1 Фев 2016 в 17:04

2 ответа

Лучший ответ

Используйте PIVOT:

SELECT *
FROM (
  VALUES ('w', 'x', 'y', 'z', 'a'),
         ('w', 'x', 'y', 'z', 'b'),
         ('w', 'x', 'y', 'z', 'c')
) AS t(w, x, y, z, col)
PIVOT (
  MAX(col) FOR col IN ([a], [b], [c])
) AS PivotTable

Вышеуказанные выходы:

w   x   y   z   a   b   c
-------------------------
w   x   y   z   a   b   c

SQLFiddle

Вышеупомянутый поворот в SQL Server (и Oracle) по существу является сокращением для следующего эквивалентного запроса:

SELECT 
  w, x, y, z, 
  MAX(CASE WHEN col = 'a' THEN 'a' END) a,
  MAX(CASE WHEN col = 'b' THEN 'b' END) b,
  MAX(CASE WHEN col = 'c' THEN 'c' END) c
FROM (
  VALUES ('w', 'x', 'y', 'z', 'a'),
         ('w', 'x', 'y', 'z', 'b'),
         ('w', 'x', 'y', 'z', 'c')
) AS t(w, x, y, z, col)
GROUP BY w, x, y, z
3
Lukas Eder 1 Фев 2016 в 16:26

Другой подход, без PIVOT или CASE - конечно, ничего плохого с ними - завершить, выбрав нужную строку из результата. Он использует самостоятельные соединения,

select * from
   (select x1.*, x2.valA as valA2, x3.valA as valA3  
    from foo x1 inner join foo x2 inner join foo x3
    on     x1.valA <> x2.valA
       and x1.valA <> x3.valA
       and x2.valA <> x3.valA) as x
order by valA, valA2, valA3

В результате чего

+------+------+------+------+------+-------+-------+
| col1 | col2 | col3 | col4 | valA | valA2 | valA3 |
+------+------+------+------+------+-------+-------+
| w    | x    | y    | z    | a    | b     | c     |
| w    | x    | y    | z    | a    | c     | b     |
| w    | x    | y    | z    | b    | a     | c     |
| w    | x    | y    | z    | b    | c     | a     |
| w    | x    | y    | z    | c    | a     | b     |
| w    | x    | y    | z    | c    | b     | a     |
+------+------+------+------+------+-------+-------+
0
B98 1 Фев 2016 в 14:47