@aljo222
В процессе обучения веб-разработке

Как получить все записи в отдельные столбцы с группировкой по ключу?

Здравствуйте!
Есть таблица product_parameters с тремя столбцами (product_id, param_key, value), в которой хранятся значения параметров товаров. Т.е. для одного товара может быть несколько записей, но при этом только одна запись для товара по какому-либо параметру.
Например
11 | param1 | крупа
11 | param2 | развес
11 | param3 | 45р/кг
44 | param1 | напиток
44 | param3 | 24р/шт
52 | param1 | быт.химия
52 | param3 | 112р/шт


Так вот, как сделать запрос, чтобы одна строка представляла записи по одному товару и значение каждого параметра было в отдельном столбце, название которого - ключ параметра? Т.е. примерно следующее
product_id | param1 | param2 | param3
11 | крупа | развес | 45р/кг
33 | фрукт | упаковка| 64р/шт


Мне нужно получить только параметры с ключами от param1 до param5.
Пытался через case when и group by, но что-то не то выходит.
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
@aljo222 Автор вопроса
В процессе обучения веб-разработке
Получилось сделать так. Не знаю, почему не работает без SUM
SELECT
    product_id,
    SUM(CASE WHEN `param_key ` = 'param1' then `value` END) param1,
    SUM(CASE WHEN `param_key ` = 'param2' THEN `value` END) param2,
    SUM(CASE WHEN `param_key ` = 'param3' THEN `value` END) param3,
    SUM(CASE WHEN `param_key ` = 'param4'  THEN `value` END) param4,
    SUM(CASE WHEN `param_key ` = 'param5'  THEN `value` END) param5
FROM product_parameters
GROUP BY product_id
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
trapwalker
@trapwalker
Программист, энтузиаст
Транспонирование таблиц в SQL не предусмотрено в большинстве БД.
Если набор параметров динамический, то так не получится, потому что не ясно сколько получится столбцов в итоге, а динамически их делать нельзя.
Можно собрать JSON с атрибутами, но это тоже такое себе.
Обычно такое транспонирование делают в коде на бэке, а не в SQL.
Между тем вы не написали даже какая у вас БД и на чем делаете бэкенд.

На постгресе оптимально было бы сделать джойн, группировку, а при агрегации собирать массив key-value, или JSON, тогда у вас будет два столбца: id, params. Второй столбец будет содержать json'ы.

Ещё один способ можно применить при более-менее статичном наборе возможных параметров. Отдельным запросом получаете все возможные уникальные имена параметров в алфавитном порядке и в том же порядке джойните слева (left join) соответствующие значения. При агрегации вы просто собираете csv-строку с строковыми значениями параметров, а для тех параметров, которых нет, будет пустая строка или null.
Можно собирать не строку с разделителями, а массив строк, или json-список.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы