[英]What is wrong with this PL/SQL Statement?
I am working with PL/SQL (Oracle). 我正在使用PL / SQL(Oracle)。 I have written queries before, but I'm not sure what is wrong with this query.
我之前写过查询,但不确定此查询出了什么问题。 The error I am getting is this:
我得到的错误是这样的:
[Error] Execution (942: 41): ORA-00979: not a GROUP BY expression.
[错误]执行(942:41):ORA-00979:不是GROUP BY表达式。
The highlighted text is: the first TRIM function in the case statement. 高亮显示的文本是:case语句中的第一个TRIM函数。 I know that I can't put this case statement in the Group By clause because I am aggregating here (using the sum function).
我知道我不能将这个case语句放在Group By子句中,因为我在这里进行汇总(使用sum函数)。 Is there something I am not understanding??
有我不明白的东西吗?
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 ;
Your problem is that you are trying to access a non aggragate ( LOBDESC
) in a grouping context. 您的问题是,您正在尝试在分组上下文中访问非凝集(
LOBDESC
)。 You have two options, choose the one which makes most sense: 您有两种选择,选择最有意义的一种:
LOBDESC
to GROUP BY
LOBDESC
添加到GROUP BY
MAX(LOBDESC)
MAX(LOBDESC)
With Oracle, when grouping, you can only select either: 使用Oracle进行分组时,您只能选择以下任一项:
GROUP BY
clause GROUP BY
子句中的字段 COUNT
, SUM
, etc) on other fields COUNT
, SUM
等) Your CASE
clause will have be rewritten. 您的
CASE
子句将被重写。 Probably, you will be better off by using analytic functions for your purpose: 可能,通过使用分析函数可以达到更好的效果:
http://psoug.org/reference/analytic_functions.html http://psoug.org/reference/analytic_functions.html
您必须将LOBDESC
添加到GROUP BY
列列表中,因为要在聚合函数外部的select
使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.