Переместить данные из разных строк с одинаковым идентификатором в те же строки, но из другого столбца в SQL

У меня есть данные как

  ID   ded1   ded2   ded3   ded4 
  ------------------------------
  1    2
  1    3
  1    4 

Я хочу:

ID   ded1   ded2   ded3   ded4
------------------------------
1    2      3      4

ded4 пусто, так как есть 3 значения, если 4-е значение было тогда ded4 заполняет

2 ответа

Решение

Хотя ответ @ConsiderMe вполне верен, вы также можете сделать 4 объединения, если у вас есть проблемы с группой или есть дополнительные столбцы, которые вы хотите включить в исходную таблицу. Иногда это единственное жизнеспособное решение. (Кстати, стержень это в основном так же, как этот код).

Этот код немного медленнее, чем ответ @CondiderMe, так как для него требуется 3 сканирования / поиска, а его всего 2. Так что используйте его только в случае необходимости.

With addRN AS
(
  SELECT *,
        row_number() OVER (PARTITION BY id ORDER BY ded1) AS rn
  FROM tbl
)
SELECT ids.id, r1.ded1 as ded1, r2.ded1 as ded2, r3.ded1 ad ded3, r4.ded1 as ded4
FROM (SELECT DISTINCT id FROM tbl) ids
LEFT JOIN addRN r1 ON ids.id = r1.id AND rn = 1
LEFT JOIN addRN r2 ON ids.id = r2.id AND rn = 2
LEFT JOIN addRN r3 ON ids.id = r3.id AND rn = 3
LEFT JOIN addRN r3 ON ids.id = r3.id AND rn = 4

Если и только если у вас ограниченное количество столбцов и вы чувствуете, что вам не нужна функция, которая присваивает ваши значения столбцу с динамическим именем, вы можете сделать это следующим образом:

Используйте аналитическую функцию, например row_number() чтобы определить порядок - какое значение должно идти под какой колонкой, а затем сгруппировать ваш результат по id и возьми max() значение, чтобы сделать один ряд из вашего CASE заявления.

SELECT
  id,
  MAX(CASE WHEN ded_rn = 1 THEN ded1 END) AS ded1,
  MAX(CASE WHEN ded_rn = 2 THEN ded1 END) AS ded2,
  MAX(CASE WHEN ded_rn = 3 THEN ded1 END) AS ded3,
  MAX(CASE WHEN ded_rn = 4 THEN ded1 END) AS ded4
FROM(
  SELECT
    *,
    row_number() OVER (PARTITION BY id ORDER BY ded1) AS ded_rn
  FROM 
    tbl
   ) foo
GROUP BY id

Вот SQL-скрипка, представляющая обсуждаемый случай с примерами данных.

Другие вопросы по тегам