ORACLE — Как отобразить 3 разных значения из одного столбца

#oracle

Вопрос:

У меня есть одна таблица с 4 типами и одним столбцом «значение», мне нужно отобразить 3 столбца на идентификатор в одном запросе. тип 1= abc,тип 2= def,тип 3= ghi,тип 4= jkl мой текущий запрос, на данный момент отображает все значения в одном столбце, мне нужен столбец для каждого типа, будет 4 столбца с разными именами

 SELECT 
 OBJECTID
,TRUNC(DATETIME   1 / (24 * 12), 'HH24') DATETIME
,TIMEZONE
,VALUE as value
,LOADID LOADID
FROM PROD.TS_WSI_HOURLY_OBSERVATION
where typeid in(1,2,3,4);
 
ID ценность
1 50
2 30
3 20
4 85

Как мне нужно отображать такой результат:

азбука защита ghi jkl
50 30 20 85.
15 10 4 34.
34 30 12 8598

Есть идеи, как это сделать? Мне нужны все строки, а не агрегации, такие как max

С уважением

Ответ №1:

Вот как мы обычно это делаем:

 SQL> with temp (gbc, id, value) as
  2    -- sample data
  3    (select 'a', 1, 50 from dual union all
  4     select 'b', 1, 15 from dual union all
  5     select 'c', 1, 34 from dual union all
  6     --
  7     select 'a', 2, 30 from dual union all
  8     select 'b', 2, 10 from dual union all
  9     select 'c', 2, 30 from dual union all
 10     --
 11     select 'a', 3, 20 from dual union all
 12     select 'b', 3,  4 from dual union all
 13     select 'c', 3, 12 from dual
 14    )
 15  select gbc,
 16         sum(case when id = 1 then value end) as abc,
 17         sum(case when id = 2 then value end) as def,
 18         sum(case when id = 3 then value end) as ghi,
 19         sum(case when id = 4 then value end) as jkl
 20  from temp
 21  group by gbc;

GBC        ABC        DEF        GHI        JKL
--- ---------- ---------- ---------- ----------
a           50         30         20
b           15         10          4
c           34         30         12

SQL>
 

Или, если бы я понял ваш запрос, вы бы просто использовали его в качестве CTE и извлекли нужные значения:

 with temp as
  (select 
      typeid,
      objectid
     ,trunc(datetime   1 / (24 * 12), 'HH24') datetime
     ,timezone
     ,value as value
     ,loadid loadid
   from prod.ts_wsi_hourly_observation
   where typeid in(1,2,3,4)
  )
select sum(case when typeid = 1 then value end) as abc,  
       sum(case when typeid = 2 then value end) as def,
       sum(case when typeid = 3 then value end) as ghi,
       sum(case when typeid = 4 then value end) as jkl
from temp
group by objectid; 
 

Комментарии:

1. Привет, у меня в этой таблице около 300 записей, как показать все это без суммы, потому что, если я удалю оператор sum, мне будет показано только одно значение на запись и 3 столбца null, мне нужно, чтобы все столбцы были заполнены

2. Точно. Вот почему я использовал SUM.

3. но сумма показала только одну запись, мне нужно показать 300 записей, а также, почему вы используете objectid, когда это typeid ?

4. Должно быть что-то еще (другие столбцы, которые вы можете использовать в списке ВЫБРАННЫХ столбцов), что не будет агрегировано, но будет использоваться для «разделения» результата на отдельные строки. Этот столбец не обязательно указывать в SELECT, но он должен использоваться в предложении GROUP BY. Почему я использовал OBJECTID? Потому что я просмотрел запрос, который вы опубликовали, и в списке ВЫБРАННЫХ столбцов нет идентификатора типа. Запрос, который я опубликовал, — это просто пример того, как это сделать; отрегулируйте его так, чтобы он соответствовал вашим потребностям (теперь, когда вы знаете, как это сделать).

5. Я отредактировал ранее опубликованный код, чтобы он включал столбец GBC (сокращение от «GroupByColumn»). Запрос с образцами данных содержит его как в SELECT, так и в GROUP BY. Запрос, основанный на вашем, содержит его только в группе ПО, где я предположил, что это объект, по которому вы будете группировать значения. Если это не так, измените его на другой столбец(ы); Я не знаю, какой из них(ов), но вы должны.