Объединение строки со столбцом в своей собственной таблице

#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