Застрял в запросе в оракуле - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть таблица как:

enter image description here

Мой ожидаемый результат (10,20,30 - дептно):

enter image description here

Итак, я попытался так:

select job,case 
                when deptno=10 then sum(sal) else null
                end dept_10_data
           ,case 
                when deptno=20 then sum(sal) else null
                end dept_20_data ,
              case 
                when deptno=30 then sum(sal) else null
                end dept_30_data       
 from ot.employee group by job;

Но я получаю сообщение об ошибке:

ORA-00979: not a GROUP BY expression

Как я могу получитьэтот вывод?

Ответы [ 3 ]

3 голосов
/ 04 ноября 2019

Вы почти у цели. Вам нужно поместить case выражение внутри агрегатной функции. Здесь вы хотите использовать sum().

select 
    job,
    sum(case when deptno = 10 then sal end) dept_10_data,
    sum(case when deptno = 20 then sal end) dept_20_data,
    sum(case when deptno = 30 then sal end) dept_30_data
from ot.employee 
group by job;
2 голосов
/ 04 ноября 2019

Ваша условная агрегация неверна. Вы должны сначала применить условие к данным, а затем агрегировать, например:

SELECT job,
       SUM(case when deptno = 10 then sal end) dept_10_data,
       ...
FROM   ot.employee
GROUP BY job;

Примечание. Я не включил значение по умолчанию, если deptno не является указанным значением, поскольку большинство агрегатных функций (включая * 1004)*) игнорировать значения NULL.

1 голос
/ 04 ноября 2019

Вы столкнулись с ошибкой из-за использования прямых столбцов в предложении select (без функции aggregate) без упоминания их в предложении group by. (Как уже упоминалось в обоих ответах).

Но вы также можете использовать PIVOT для того же вывода, как указано ниже:

Select * from
(Select job, deptno, sal from ot.employee)
Pivot
(Sum(sal) for deptno in (10,20,30))

Cheers !!

...