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 шт):
С подсказкой 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 в одну колонку. В моем случае разложило в две, как и нужно.