@KuznetsFV

SQL. Как переформировать строки в столбцы?

Имеется таблица следующего вида:
5f89e76531aaf113427268.png

CREATE TABLE new_t(id INT, type_data TEXT, amount INT, year INT, PRIMARY KEY(id));

INSERT INTO new_t VALUES(1, 'First', 500, 2018);
INSERT INTO new_t VALUES(2, 'Second', 90, 2018);
INSERT INTO new_t VALUES(3, 'First', 300, 2019);
INSERT INTO new_t VALUES(4, 'Second', 250, 2019);
INSERT INTO new_t VALUES(5, 'First', 600, 2020);
INSERT INTO new_t VALUES(6, 'Second', 500, 2020);

Из нее надо составить таблицу вида
5f89e8a34ea8c265159576.png

Сделать это надо одним запросом без создания новой таблицы.
Т.е. мне нужно выбрать через SELECT уникальные значения из последнего столбца и сделать их новыми столбцами

Уникальные значения я ищу через ORDER BY запросом:
SELECT DISTINCT year FROM new_t ORDER BY year ASC

Но я получаю строки, а не столбцы. Если я делаю второй SELECT, то результат совсем не тот, который я хочу увидеть:
SELECT type_data, (SELECT DISTINCT year FROM new_t ORDER BY year ASC) FROM new_t GROUP BY type_data

Все форумы перелистал и не могу понять, как можно сделать запрос, который переформирует строки в столбцы. Значения в столбцах могут быть любого количества, поэтому важно не зависеть от текущих значений, а получать их количество именно через SELECT.

Что я не так делаю?
  • Вопрос задан
  • 3980 просмотров
Пригласить эксперта
Ответы на вопрос 2
@mletov
Для подобных вещей есть PIVOT и UNPIVOT
Но поскольку количество столбцов динамическое, то в чистом виде они так не умеют, поэтому ту часть запроса, где перечень столбцов, я бы формировал динамически (PHP, C#, T-SQL и т д... короче, что используете помимо чистых запросов)

https://www.sqlshack.com/dynamic-pivot-tables-in-s...

PS А вообще неплохо бы в теги добавить название БД: MSSQL, MYSQL, Oracle и т д
Ответ написан
Комментировать
@AstraVlad
Финансист, консультант, программист-любитель
Вот здесь описано как это можно сделать, начиная со слов: "But what happens if you don’t know the dates ahead of time...".
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы