SQL объединяет строку идентификатора дубликата в уникальную строку с дополнительным столбцом

0

У меня есть headhache, пытаясь заставить этот простой запрос работать в SQL на очень большой базе данных, возможно, некоторые из вас могут помочь?

ID|R1 |R2
1 | a | b
1 | c | d
2 | a | b
2 | c | d

Я хотел бы сделать запрос выбора sql, чтобы получить вместо этого:

ID|R1 |R2 |R3 |R4
1 | a | b | c | d
2 | a | b | c | d

Спасибо за любую помощь !

  • 1
    Что вы хотите сделать, это PIVOT, поиск вокруг
  • 2
    У каждого id всегда будет ровно две строки? Имеет ли значение, какие значения строк r3 в r3 и r4 ?
Показать ещё 2 комментария
Теги:
database
select

3 ответа

2
Лучший ответ

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

SELECT
    ID, GROUP_CONCAT(val ORDER BY val) val
FROM
(
    SELECT ID, R1 AS val FROM yourTable
    UNION ALL
    SELECT ID, R2 FROM yourTable
) t
GROUP BY ID;

демонстрация

Этот подход желательно по нескольким причинам. Во-первых, он является надежным в отношении любого произвольного количества "столбцов", которые может иметь данный ID. Во-вторых, он дает нам возможность упорядочивать каждую строку значений любым способом. Наконец, это будет намного легче поддерживать, чем точный ответ с использованием переменных сеанса, чтобы имитировать такие вещи, как номер строки.

  • 0
    если таблица большая, вам нужно использовать SET SESSION group_concat_max_len = @@max_allowed_packet; также
1

Это сложно, потому что в вашем столе недостаточно идентификаторов. Один из методов - использовать переменные, добавить порядковый номер и совокупность:

select id,
       max(case when rn = 1 then r1 end) as r1,
       max(case when rn = 1 then r2 end) as r2,
       max(case when rn = 2 then r1 end) as r3,
       max(case when rn = 2 then r2 end) as r4
from (select t.*,
             (@rn := if(@i = id, @rn + 1,
                        if(@i := id, 1, 1)
                       )
             ) as rn
      from (select t.*
            from t
            order by t.id
           ) t cross join
           (select @rn := 0, @i := -1) params
     ) t
group by id;
1

Этот ответ немного обновляется до ответа @TimBiegeleisen.

если таблица большая, вам также необходимо использовать

SET SESSION group_concat_max_len = @@max_allowed_packet;

Этот запрос преобразует разделенные запятыми значения из функции GROUP_CONCAT в столбцы, используя вложенные функции SUBSTRING_INDEX.

запрос

SELECT 
   ID
 , SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 1), ',', -1) AS r1
 , SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 2), ',', -1) AS r2
 , SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 3), ',', -1) AS r3
 , SUBSTRING_INDEX(SUBSTRING_INDEX(val, ',', 4), ',', -1) AS r4
FROM (

  SELECT
      ID, GROUP_CONCAT(val ORDER BY val) val
  FROM
  (
      SELECT ID, R1 AS val FROM yourTable
      UNION ALL
      SELECT ID, R2 FROM yourTable
  ) t
  GROUP BY ID
) x

см. демо http://rextester.com/SDF72100

  • 0
    Умный +1 ... возможно, ОП вызывает это из чего-то вроде Java, и фактические столбцы будут полезны

Ещё вопросы

Сообщество Overcoder
Наверх
Меню