#sql
#sql
Вопрос:
У меня есть таблица, сгенерированная после внутреннего соединения, которая выглядит как
Таблица после объединения.
ID_ACC | Model_1 | Model_2 | Model_3 | ACTUAl |
1 | m1_val1 | m2_val1 | m3_val1 | val1 |
2 | m1_val2 | m2_val2 | m3_val2 | val2 |
3 | m1_val3 | m2_val3 | m3_val3 | val3 |
4 | m1_val4 | m2_val4 | m3_val4 | val4 |
5 | m1_val5 | m2_val5 | m3_val5 | val5 |
Я хочу, чтобы эта таблица была обновлена и создала новую таблицу, которая должна быть такой
Таблица, которая требуется.
ID_ACC | Model | Value | ACTUAl |
1 | Model_1 | m1_val1 | val1 |
1 | Model_2 | m1_val2 | val1 |
1 | Model_3 | m1_val3 | val1 |
2 | Model_1 | m2_val1 | val2 |
2 | Model_2 | m2_val2 | val2 |
2 | Model_3 | m2_val3 | val2 |
3 | Model_1 | m3_val1 | val3 |
3 | Model_2 | m3_val2 | val3 |
3 | Model_3 | m3_val3 | val3 |
4 | Model_1 | m4_val1 | val4 |
4 | Model_2 | m4_val2 | val4 |
4 | Model_3 | m4_val3 | val4 |
5 | Model_1 | m5_val1 | val5 |
5 | Model_2 | m5_val2 | val5 |
5 | Model_3 | m5_val3 | val5 |
Итак, каким должен быть запрос, чтобы получить эти результаты из приведенной выше таблицы?
Комментарии:
1. Можете ли вы добавить свою исходную таблицу в этот вопрос? Пункты неясны.
2. Я удалил эти конфликтующие теги СУБД. Верните один из них обратно, тот, который фактически используется для СУБД.
3. Если это результат внутреннего объединения, возможно, лучше изменить этот запрос, чтобы для начала не объединять несколько строк в столбцы.
4. Спасибо, но решение, которое представлено ниже, работает для меня должным образом, и причина, по которой исходные данные не добавляются, заключается в том, что данные состоят из конфиденциальных данных.
Ответ №1:
используйте объединение всех
select ID_ACC, 'Model_1' as model,Model_1 as value, actual from tablename
union all
select ID_ACC, 'Model_2' as model,Model_2 as value, actual from tablename
union all
select ID_ACC, 'Model_3' as model,Model_3 as value, actual from tablename
Комментарии:
1. Большое вам спасибо за это решение, это то, что я искал, и я узнал об объединении еще лучше.
Ответ №2:
Ниже приведен стандартный ANSI SQL:
select t.*
from models
cross join lateral (
values
(id_acc, model_1, 'Model 1', actual),
(id_acc, model_2, 'Model 2', actual),
(id_acc, model_3, 'Model 3', actual)
) as t(id_acc, value, model, actual)
order by id_acc;
Онлайн-пример: https://rextester.com/ZHZJR43210
Или с помощью UNPIVOT
оператора:
select id_acc, model, value, actual
from models
unpivot (value for model in (model_1 as 'Model 1',
model_2 as 'Model 2',
model_3 as 'Model 3'));
Онлайн-пример: https://dbfiddle.uk/?rdbms=oracle_18amp;fiddle=e270ddae4449127a64a345f0066832e6