2017-06-09 8 views
1

以下のコードでエラーが発生します。ここでは、集計関数の組み合わせとグループ化の組み合わせを使用します。Oracle SQLはリストと一緒に分析関数を使用するとエラーを投げます。グループ:

私は一人で、この分析部分を実行すると、それがうまく動作します(私はLISTAGG & GROUP BYを使用してはいけない場所)

SELECT 
NUM, 
SUM(COLLECTION) OVER(PARTITION BY STATUS ORDER by DT) AS TOTL_STUS 
FROM 
(select '1' AS NUM,'AA' NAME,'AC' AS STATUS, '10' AS COLLECTION, 
TO_DATE('06/09/2017','MM/DD/YYYY') AS DT from dual 
UNION ALL 
select '2' AS NUM,'DC' NAME,'CL' AS STATUS, '100' AS COLLECTION, 
TO_DATE('06/09/2017','MM/DD/YYYY')-2 AS DT from dual 
UNION ALL 
select '3' AS NUM,'MA' NAME,'PE' AS STATUS, '110' AS COLLECTION, 
TO_DATE('06/09/2017','MM/DD/YYYY')-10 AS DT from dual 
UNION ALL 
select '1' AS NUM,'AA' NAME,'DS' AS STATUS, '200' AS COLLECTION, 
TO_DATE('06/09/2017','MM/DD/YYYY')+5 AS DT from dual 
UNION ALL 
select '2' AS NUM,'DC' NAME,'AC' AS STATUS, '1000' AS COLLECTION, 
TO_DATE('06/09/2017','MM/DD/YYYY') AS DT from dual 
) 
; 

私はLISTAGGを使用する場合、それBY & GROUPは(ノー分析列)の罰金を実行します

SELECT 
NUM, 
regexp_replace(listagg(STATUS, ',') within group (order by DT) ,'([^,]+)(,\1)*(,|$)', '\1\3')AS UNDUP_STATS 
FROM 
(select '1' AS NUM,'AA' NAME,'AC' AS STATUS, '10' AS COLLECTION, 
TO_DATE('06/09/2017','MM/DD/YYYY') AS DT from dual 
UNION ALL 
select '2' AS NUM,'DC' NAME,'CL' AS STATUS, '100' AS COLLECTION, 
TO_DATE('06/09/2017','MM/DD/YYYY')-2 AS DT from dual 
UNION ALL 
select '3' AS NUM,'MA' NAME,'PE' AS STATUS, '110' AS COLLECTION, 
TO_DATE('06/09/2017','MM/DD/YYYY')-10 AS DT from dual 
UNION ALL 
select '1' AS NUM,'AA' NAME,'DS' AS STATUS, '200' AS COLLECTION, 
TO_DATE('06/09/2017','MM/DD/YYYY')+5 AS DT from dual 
UNION ALL 
select '2' AS NUM,'DC' NAME,'AC' AS STATUS, '1000' AS COLLECTION, 
TO_DATE('06/09/2017','MM/DD/YYYY') AS DT from dual 
) 
GROUP BY NUM 
; 

しかし、私は両方を実行して実行します。

SELECT 
NUM, 
SUM(COLLECTION) OVER(PARTITION BY STATUS ORDER by DT) AS TOTL_STUS, 
regexp_replace(listagg(STATUS, ',') within group (order by DT) ,'([^,]+)(,\1)*(,|$)', '\1\3')AS UNDUP_STATS 
FROM 
(select '1' AS NUM,'AA' NAME,'AC' AS STATUS, '10' AS COLLECTION, 
TO_DATE('06/09/2017','MM/DD/YYYY') AS DT from dual 
UNION ALL 
select '2' AS NUM,'DC' NAME,'CL' AS STATUS, '100' AS COLLECTION, 
TO_DATE('06/09/2017','MM/DD/YYYY')-2 AS DT from dual 
UNION ALL 
select '3' AS NUM,'MA' NAME,'PE' AS STATUS, '110' AS COLLECTION, 
TO_DATE('06/09/2017','MM/DD/YYYY')-10 AS DT from dual 
UNION ALL 
select '1' AS NUM,'AA' NAME,'DS' AS STATUS, '200' AS COLLECTION, 
TO_DATE('06/09/2017','MM/DD/YYYY')+5 AS DT from dual 
UNION ALL 
select '2' AS NUM,'DC' NAME,'AC' AS STATUS, '1000' AS COLLECTION, 
TO_DATE('06/09/2017','MM/DD/YYYY') AS DT from dual 
) 
GROUP BY NUM 
; 

以下は、エラーをスローするサンプルクエリです。

ORA-00979: not a GROUP BY expression 
    00979. 00000 - "not a GROUP BY expression" 
    *Cause:  
    *Action: 
    Error at Line: 3 Column: 5 

このエラーの原因を理解し、問題を解決するのに役立つ人がいますか。

+0

このようなデータを作成するときには、「UNION」を使用することができないという悪い習慣があります。代わりに 'UNION ALL'を使用してください。 – mathguy

+0

提案に感謝します。私はデータを複製していないことを知っています。サンプルデータ用です私はコードを更新しました。 – Kumaran

答えて

0

あなたのお問い合わせはですか?分析合計はstatusで区切られ、numではなく、どのコードにも関係なく、あなたが達成しようとしていることは明確ではありません。あなたは正しいロジックを持っていますか?

クエリは次の順序で評価されます。FROM句は、作業する行を生成します。この部分はあなたの例ではっきりしています。次に、JOINとWHERE条件が評価されます。 (あなたの例には何もありません)。そして、GROUP BY句で要求されたグループが形成されます。この時点でのみSELECT句が評価され、GROUP BY句がある場合、SELECT句にはGROUP BY、定数式、集計関数、および式に含まれる列(またはより一般的には式)のみが含まれますこれらから。

例では、NUMでグループ化した後、partition by句の「ステータス」、またはorder by句のdtという、分析合計の意味はどうですか?彼らはもう存在しません。さらに、集計関数ではなく解析関数を使用しようとしているので、引数collectionも「グループ化」式でなければなりません。エラーメッセージはエラーの原因としてcollectionを指しますが、他の2つも同様です。

関連する問題