MySQL преобразование нескольких строк в столбцы в одной строке - PullRequest
7 голосов
/ 26 июня 2010

У меня есть таблица данных с колонками:

  • user_id int
  • code int
  • значение int

И я хочусоздать сводную таблицу, которая выглядит следующим образом:

  • user_id int
  • valueA int
  • valueB int

В таблице сведений,valueA будет соответствовать, скажем, код 5, и valueB будет соответствовать, скажем, код 6, поэтому я ищу что-то вроде:

вставить в сводку (user_id, valueA, valueB) VALUES (SELECT ???от деталей);

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

Например, если ябыли следующие строки в деталях:

1  5  100
1  6  200
2  5  1000
2  6  2000

Я хочу закончить со следующими в сводной таблице:

1  100   200
2  1000  2000

Есть идеи?

Ответы [ 3 ]

9 голосов
/ 26 июня 2010

MySQL не имеет синтаксиса PIVOT / UNPIVOT, что позволяет использовать комбинацию выражений GROUP BY и CASE:

INSERT INTO SUMMARY
  (user_id,valueA,valueB) 
  SELECT d.user_id,
         MAX(CASE WHEN d.code = 5 THEN d.value ELSE NULL END),
         MAX(CASE WHEN d.code = 6 THEN d.value ELSE NULL END),
    FROM DETAILS d
GROUP BY d.user_id
2 голосов
/ 26 июня 2010
insert into summary (user_id,valueA,valueB) 
SELECT a.user_id, a.value, b.value 
from details a 
join details b on a.user_id = b.user_id 
WHERE a.code = 5 and b.code = 6;

будьте осторожны: у вас будет несколько сводных столбцов, если код user_id + не уникален.

РЕДАКТИРОВАТЬ:

insert into summary (user_id,valueA,valueB) 
select u.user_id, ifnull(a.value,0), ifnull(b.value,0)
from (select distinct user_id from details /* where code in (5,6) */) u
left join details a on a.user_id = u.user_id and a.code = 5
left join details b on b.user_id = u.user_id and b.code = 6
0 голосов
/ 26 июня 2010

Если у вас есть управляемый набор кодов (скажем, только 5 и 6), вы можете сделать что-то вроде этого:

SELECT details.user_id, code5.value, code6.value
FROM details JOIN
  (SELECT user_id, value FROM details WHERE code = 5) AS code5 USING(user_id)
  JOIN
  (SELECT user_id, value FROM details WHERE code = 6) AS code6 USING(user_id);

Возможно, вам придется изменить JOIN s в зависимости от того, являются ли ваши кодыне требуется как отношение 1 к 1 (т. е. LEFT JOIN s).

Если у вас большой набор кодов, я бы посмотрел, как курсор запускает аналогичный запрос выше над набором результатов ваших кодов или используядругая технология (например, скрипт PHP).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...