0

PL/SQL (Oracle) を使用しています。以前にクエリを作成したことがありますが、このクエリの何が問題なのかわかりません。私が得ているエラーはこれです:

[エラー] 実行 (942: 41): ORA-00979: GROUP BY 式ではありません。

強調表示されているテキストは、case ステートメントの最初の TRIM 関数です。ここで (sum 関数を使用して) 集計しているため、この case ステートメントを Group By 句に入れることができないことはわかっています。私が理解していない何かがありますか??

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 ; 
4

3 に答える 3

4

あなたの問題はLOBDESC、グループ化コンテキストで非集計 ( ) にアクセスしようとしていることです。2 つのオプションがあります。最も適切な方を選択してください。

  • LOBDESCに追加GROUP BY
  • 集約関数を使用します。つまり、MAX(LOBDESC)
于 2011-05-18T13:46:25.797 に答える
2

Oracle では、グループ化するときに次のいずれかのみを選択できます。

  • GROUP BY句に現れるフィールド
  • 他のフィールドの集計関数 ( COUNTSUMなど)

あなたのCASE条項は書き直されます。おそらく、目的に合わせて分析関数を使用することで、より良い結果が得られるでしょう。

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

于 2011-05-18T13:42:48.643 に答える
2

集計関数の外部で使用しているためLOBDESCGROUP BY列リストに追加する必要があります。select

于 2011-05-18T13:45:34.820 に答える