Что не так с этим оператором PL / SQL?

#sql #oracle #select #ora-00979

#sql #Oracle #выберите #ora-00979

Вопрос:

Я работаю с PL / SQL (Oracle). Я писал запросы раньше, но я не уверен, что не так с этим запросом. Ошибка, которую я получаю, заключается в следующем:

[Ошибка] Выполнение (942: 41): ORA-00979: не группируется по выражению.

Выделенный текст: первая функция TRIM в инструкции case. Я знаю, что не могу поместить этот оператор case в предложение Group By, потому что я выполняю агрегирование здесь (используя функцию sum). Я чего-то не понимаю??

 SELECT 
T.PLANNAME, 
M.CLASS, 
M.BRAND_OR_GENERIC, 
T.PROCEDURECODE, 
M.BRAND_NAME, 
M.GENERIC_NAME, 
CASE 
WHEN (TRIM(PLANNAME) = 'XXXX' AND TRIM(LOBDESC) = 'COMMERCIAL') THEN ROUND((SUM(ALLOWEDAMT)/160000)*1000000, 2)
WHEN (TRIM(PLANNAME) = 'XXXX' AND TRIM(LOBDESC) = 'MEDICARE') THEN ROUND((SUM(ALLOWEDAMT)/14000)*1000000, 2)
WHEN (TRIM(PLANNAME) = 'YYYY' AND TRIM(LOBDESC) = 'COMMERCIAL') THEN ROUND((SUM(ALLOWEDAMT)/1800000)*1000000, 2)
WHEN (TRIM(PLANNAME) = 'YYYY' AND TRIM(LOBDESC) = 'MEDICARE') THEN ROUND((SUM(ALLOWEDAMT)/35000)*1000000, 2)
WHEN (TRIM(PLANNAME) LIKE 'ZZZZ%' AND TRIM(LOBDESC) = 'COMMERCIAL') THEN ROUND((SUM(ALLOWEDAMT)/1200462)*1000000, 2)
WHEN (TRIM(PLANNAME) LIKE 'ZZZZ%' AND TRIM(LOBDESC) = 'MEDICARE') THEN ROUND((SUM(ALLOWEDAMT)/235000)*1000000, 2)
WHEN (TRIM(PLANNAME) = 'AAAA' AND TRIM(LOBDESC) = 'COMMERCIAL') THEN ROUND((SUM(ALLOWEDAMT)/200000)*1000000, 2)
WHEN (TRIM(PLANNAME) = 'BBBB' AND TRIM(LOBDESC) = 'MEDICAID') THEN ROUND((SUM(ALLOWEDAMT)/147000)*1000000, 2)
END As AllowedPerMM,
SUM(T.ALLOWEDAMT) As SumOfALLOWEDAMT 


FROM FIN.TR_2011 T
LEFT JOIN FIN.TR_REFERENCE M ON T.PROCEDURECODE = M.PROCEDURECODE

WHERE 
T.PROCEDURECODE IS NOT NULL AND  
(T.PROCEDURECODE <> '0' or T.PROCEDURECODE <> 0)  AND 

(T.PROCEDURECODE Like 'J%' OR 
T.PROCEDURECODE Like 'C9%' OR
T.PROCEDURECODE Like 'S0%' OR
T.PROCEDURECODE Like 'Q%' OR 
T.PROCEDURECODE = '90378' OR 
T.PROCEDURECODE IN ( 
'J9171', 'J9265', 'J9264', 
'J2430', 'J3487',
'J9000', 'J9001') OR
M.THERAPEUTIC_CLASS IN ('RA')
) AND 
TRIM(T.YEAR) IN ('2010')

GROUP BY 
T.PLANNAME, 
M.CLASS, 
M.BRAND_OR_GENERIC, 
T.PROCEDURECODE, 
M.BRAND_NAME, 
M.GENERIC_NAME

ORDER BY SumOfALLOWEDAMT DESC ; 
  

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

1. Документация oracle включает в себя целую книгу, посвященную объяснению сообщений об ошибках. Найдите его здесь: download.oracle.com/docs/cd/B10500_01/server.920/a96525 /…

Ответ №1:

Ваша проблема в том, что вы пытаетесь получить доступ к неагрегату ( LOBDESC ) в контексте группировки. У вас есть два варианта, выберите тот, который имеет наибольший смысл:

  • Добавить LOBDESC в GROUP BY
  • Используйте агрегатную функцию, т.Е. MAX(LOBDESC)

Ответ №2:

В Oracle при группировании вы можете выбрать только либо:

  • Поля, появляющиеся в GROUP BY предложении
  • Агрегирующие функции ( COUNT , SUM и т.д.) для других полей

Ваше CASE предложение будет переписано. Вероятно, вам будет лучше использовать аналитические функции для ваших целей:

http://psoug.org/reference/analytic_functions.html

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

1. При добавлении оператора case в Group By он выделяет текстовую сумму в операторе case и выдает ошибку: ORA-00934: функция group здесь не разрешена

2. @JK: Да, я только что подумал об этом. Вы используете SUM там, которое нельзя сгруппировать

Ответ №3:

Вам нужно добавить его LOBDESC в GROUP BY список столбцов, потому что вы используете его select вне функции объединения.