都道府県穴埋めゲーム

お世話になっています。

現在下記のようなSQLを組んでいます。

ビュー1の集計結果
UNION ALL
ビュー2の集計結果
UNION ALL
ビュー3の集計結果

実行結果 例

年月     人数  金額
201104   3    20000
201105   2    10000
201104   1    5000

GROUP BY句で年月を集計したビューをUNION ALLでつないでいるため、
当然のように同じ年月が何度も出てくるため、テストがしづらくなっています。

やりたいこととしては、さっきの実行結果をさらに年月で集計することを
考えています。

年月     人数  金額
201104   4    25000
201105   2    10000


対策として、下記のように集計したビューをUNION ALLでつないだ結果を
さらに集計するSQLを作りました。

SELECT 
FROM(
ビュー1の集計結果
UNION ALL
ビュー2の集計結果
UNION ALL
ビュー3の集計結果

GROUP BY


その結果、下記のエラーが発生しました。
ORA-00935:グループ関数のネスト・レベルが深すぎます。

環境はoracle11gです。

あとは、SQLのFROM句の()の部分をビューとして作成し、
更にそのビューを呼び出して集計するくらいしか思いつかないです。

今回作ろうとしてるのはテスト用のSQLのため、SQL文と実行結果を残したいので、
できればビューやプロシージャーは作らずに、SQLのみで作成したいと考えています。

何か良い方法はありますでしょうか?

宜しくお願い致します。

A 回答 (3件)

こういう指摘がありますけど


http://www.confrage.com/oracle/oracle_sql/tips/g …

この回答への補足

早々と回答ありがとうございます。

グループ関数は2回までしか使っていません。

あくまで、ビューAの集計結果とビューBの集計結果で集計がやりたいだけですので、
2回です。

補足日時:2011/11/29 09:01
    • good
    • 1

これじゃダメですか?



SELECT
 TO_CHAR(V_SYORI_YM, 'YYYYMM') AS "年月" ,
 SUM(V_A_CHAG),
 SUM(V_B_CHAG),
 SUM(V_C_CHAG),
 SUM(V_ALL_CHAG)
FROM
 (
 SELECT
  V_SYORI_YM,
  V_A_CHAG,
  V_B_CHAG,
  V_C_CHAG,
  V_ALL_CHAG
 FROM
  V_001
 WHERE
  V_CRT_DTS >= TO_DATE('20110401', 'YYYYMMDD') AND
  V_CRT_DTS < TO_DATE('20120401', 'YYYYMMDD')
 UNION ALL
 SELECT
  V_SYORI_YM,
  V_A_CHAG,
  V_B_CHAG,
  V_C_CHAG,
  V_ALL_CHAG
 FROM
  V_002I
 WHERE
  V_SYORI_YM >= TO_DATE('20110401', 'YYYYMMDD') AND
  V_SYORI_YM < TO_DATE('20120401', 'YYYYMMDD')
 )
GROUP BY
  TO_CHAR(V_SYORI_YM, 'YYYYMM');
    • good
    • 0

> ビュー1の集計結果


> UNION ALL
> ビュー2の集計結果
> UNION ALL
> ビュー3の集計結果

のビューのSQLの概略と

> SELECT
> FROM(
> ビュー1の集計結果
> UNION ALL
> ビュー2の集計結果
> UNION ALL
> ビュー3の集計結果
> )
> GROUP BY

の実際の記述全体を提示できますか?

この回答への補足

全体の記述は下記のとおりです。

そのまま転載するわけにはいかないので、ビュー名、項目名等は変更してあります。


SELECT "処理年月" AS "年月" ,SUM("調定額_A") ,SUM("調定額_B)" ,SUM("調定額_C)" ,SUM("調定額_合計)"
FROM (

SELECT SUBSTR(TO_CHAR(V_SYORI_YM,'YYYYMMDD'),1,6) AS "処理年月"
, SUM(V_A_CHAG) AS "調定額_A" , SUM(V_B_CHAG) AS "調定額_B"
, SUM(V_C_CHAG) AS "調定額_C" , SUM(V_ALL_CHAG) AS "調定額_合計"
 FROM V_001
WHERE TO_DATE(TO_CHAR(V_CRT_DTS,'YYYYMMDD'),'YYYYMMDD') >= TO_DATE('20110401','YYYYMMDD')
AND TO_DATE(TO_CHAR(V_CRT_DTS,'YYYYMMDD'),'YYYYMMDD') < TO_DATE('20120401','YYYYMMDD')
 GROUP BY SUBSTR(TO_CHAR(V_SYORI_YM,'YYYYMMDD'),1,6)
UNION ALL
SELECT SUBSTR(TO_CHAR(V_SYORI_YM,'YYYYMMDD'),1,6) AS "処理年月" , SUM(V_A_CHAG) AS "調定額_A" , SUM(V_B_CHAG) AS "調定額_B"
, SUM(V_C_CHAG) AS "調定額_C" , SUM(V_ALL_CHAG) AS "調定額_合計"
 FROM V_002I
WHERE V_SYORI_YM >= TO_DATE('20110401','YYYYMMDD')
AND V_SYORI_YM < TO_DATE('20120401','YYYYMMDD')
   GROUP BY SUBSTR(TO_CHAR(V_SYORI_YM,'YYYYMMDD'),1,6)
)
GROUP BY "処理年月" AS "年月"



FROM()の中身がビューの集計結果をUNIONALLでつないだものです。
内容はGROUPBY句で年月を指定して、SUMで集計してるだけのシンプルなものです。

今回は、これを更にもう1度集計し、同じ年月が複数回出てくるのを阻止しようとしています。

そのため、集計は2回行ってますが、2回ではoracleのエラーにはひっかからないはずなのですが、
そこがよくわかりません。

補足日時:2011/11/29 11:19
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


おすすめ情報