#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. Запрос, основанный на вашем, содержит его только в группе ПО, где я предположил, что это объект, по которому вы будете группировать значения. Если это не так, измените его на другой столбец(ы); Я не знаю, какой из них(ов), но вы должны.