【问题标题】:What is wrong with this PL/SQL Statement?这个 PL/SQL 语句有什么问题?
【发布时间】:2011-08-28 02:08:24
【问题描述】:

我正在使用 PL/SQL (Oracle)。 我以前写过查询,但我不确定这个查询有什么问题。我得到的错误是:

[错误] 执行 (942: 41): ORA-00979: 不是 GROUP BY 表达式。

突出显示的文本是:case 语句中的第一个 TRIM 函数。我知道我不能把这个 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 ; 

【问题讨论】:

标签: sql oracle select ora-00979


【解决方案1】:

您的问题是您试图在分组上下文中访问非聚合 (LOBDESC)。您有两种选择,请选择最有意义的一种:

  • LOBDESC 添加到GROUP BY
  • 使用聚合函数,即MAX(LOBDESC)

【讨论】:

    【解决方案2】:

    使用 Oracle,在分组时,您只能选择以下任一:

    • 出现在GROUP BY 子句中的字段
    • 其他字段的聚合函数(COUNTSUM 等)

    您的CASE 子句将被重写。或许,为你的目的使用分析函数会更好:

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

    【讨论】:

    • 将case语句添加到Group By时,会突出显示case语句中的文本sum并报错:ORA-00934: group function is not allowed here
    • @JK:是的,我就是这么想的。您在那里使用SUM,无法分组
    【解决方案3】:

    您必须将LOBDESC 添加到GROUP BY 列列表中,因为您在聚合函数之外的select 中使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      相关资源
      最近更新 更多