MySQL Транспонировать и перестроить таблицу

Есть следующая таблица:

ts choice_one choice_two correct_one correct_two
111 ok ok ok crit
222 ok ok ok ok

Нужен запрос SQL, который создает на ее основе следующую:

ts category choice correct
111 one ok ok
111 two ok crit
222 one ok ok
222 two ok ok

Пояснения по происходящему

Должны появиться колонки choice и correct (были частью заголовков), а one и two (вторая часть заголовков) отделяются в новую колонку category. На пересечении их собственно остаются соответствующие значения.

В рабочей таблице порядка 20 категорий one, two, three и т.д. (их названия заранее известны), для каждой из которых существует пара choice - correct (фактическая и верная разметка категорий соответственно), итого около 40 колонок. Нужно сделать таким образом "разворачивание" таблицы по вертикали, когда останется только 4 вышеописанные колонки, но число строк увеличится.


Ответы (1 шт):

Автор решения: Rugert

С подсказкой Akina получил решение. Используем UNION ALL, либо в моем случае UNION (дает эффект UNION ALL + DISTINCT)

CREATE TABLE mytable (
  ts INT,
  choice_one varchar(50),
  choice_two varchar(50),
  etalon_one varchar(50),
  etalon_two varchar(50)
);

INSERT INTO mytable (ts, choice_one, choice_two, etalon_one, etalon_two) VALUES
('111', 'ok', 'ok', 'ok', 'crit'),
('222', 'ok', 'ok', 'ok', 'ok');

SELECT ts, choice_one AS choice, 'one' AS category
FROM mytable
  UNION
SELECT ts, choice_two AS choice, 'two' AS category
FROM mytable
  UNION
SELECT ts, etalon_one AS correct, 'one' AS category
FROM mytable
  UNION
SELECT ts, etalon_two AS correct, 'two' AS category
FROM mytable

В зависимости от версии может сложить choise и correct в одну колонку. В моем случае разложило в две, как и нужно.

→ Ссылка