![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
たとえば、次のSQLがあったとして、
select キー1, キー2, sum(金額)
(
select A.キー1 , A.キー2 , A.金額
from (select * from ~ where ...) A
union all
select '' , A.キー2 , A.金額
from (select * from ~ where ...) A
union all
select A.キー1 , '' , A.金額
from (select * from ~ where ...) A
union all
select '' , '' , A.金額
from (select * from ~ where ...) A
)
group by キー1, キー2
一番内側の副照会は、
(select * from ~ where ...) A
は、4箇所とも同じSQL文で、とても長いのですが
2箇所目以降は、1箇所目と同じSQL文ということで
記述を省けたりするような構文があったりしないでしょうか?
そこを、ビューにしろといわれるとその通りなのですが
ビューにしたくないです。(プログラムで動的にここの副照会部分を
パラメータに応じて作っているので、ビューにするとビューがいくつも
できて、きりがない)
Oracle9iで、利用しています。
No.3ベストアンサー
- 回答日時:
SQL99における、共通表式 WITH句。
http://www.atmarkit.co.jp/fnetwork/tokusyuu/01sq …
が判りやすい。
今回のケースは、CUBEが最適です。
ただし、CUBEを使わなくても、発想の転換で、
select キー1, キー2, sum(金額)
from
(
select X,decode(X,1,A.キー1,2,null,3,A.キー1,null) キー1,
decode(X,1,A.キー2,2,A.キー2,null) キー2, A.金額
from
(select * from ~ where ...) A,
(select 1 X from dummy union all select 2 from dummy union all
select 3 from dummy union all select 4 from dummy) B
)
group by X,キー1, キー2
に書き換え可能です。
CUBEで対応できないような事例であっても、必ずしも同じSQLを複数回書かなければならないとは限りません。
当然、書かざるおえない場合はありますが、創意工夫で解決できることもあります。
ありがとうございます。
WITH句が、まさに捜し求めていたものです。
ただし、今回は、ご指摘の通り、CUBEで行こうと思います。
なるほど、そんな書き換え方もあるんですね。
勉強になりました。
No.2
- 回答日時:
質問に対しては一時表で実現できると答えられます。
ただ、unionを使用する場合、本当にそれが必要かどうか考えたほうが良いかと思います。
今回は単純で目的がクロス集計のようですから、
SELECT
A.キー1, A.キー2, sum(A.金額)
FROM (select * from ~ where ...) A
GROUP BY CUBE(A.キー1, A.キー2)
で済みます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL SQLです。下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 「昨年の各月の総降 1 2023/07/01 00:32
- Access(アクセス) MAXで0が出力される 1 2022/03/31 21:43
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- Access(アクセス) アクセス 有効なフィールド名、または式として認識できませんのエラー 3 2022/08/19 11:53
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- MySQL うまくいきません教えてくださいお願いしますSQLです。クエリ構文です。 1 2023/07/07 12:39
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- MySQL 書籍の内容はまともでしょうか? 1 2023/01/22 03:07
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 日本の全市区町村を人口密度が低 1 2023/06/18 19:51
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
sqlのwhereで指定した条件の前...
-
SELECT文でINを使わずに検索したい
-
あるカラムのMAX値+1をINSERTし...
-
ループの仕方
-
Oracleでの文字列連結サイズの上限
-
GROUP BYを行った後に結合した...
-
キーが同じを複数行を1行にま...
-
SQL文で右から1文字だけ削除す...
-
Access終了時の最適化が失敗?
-
Excelでセルの書式設定を使用し...
-
GROUP BYを使ったSELECT文の総...
-
ADO VBA 実行時エラー3021
-
Accessで別テーブルの値をフォ...
-
外部結合とor条件混在の記述方法
-
SELECTで1件のみ取得するには?
-
固定値を含む結合と複数テーブ...
-
SELECTの結果で同一行を複数回...
-
SQL>UPDATEと同時にその件数を...
-
チェックボックスの項目をDBにi...
-
Excelで、改行がある場合の条件...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
あるカラムのMAX値+1をINSERTし...
-
レコードが選択されないときの...
-
複数行を1行にするSQL
-
テーブル結合について、下記SQL...
-
Oracle 9iで英字を含まないレコ...
-
SQLPLUSにて演算子を使う方法と...
-
外部結合に条件をつけたい
-
SELECT文でINを使わずに検索したい
-
ORACLEのSQLで
-
ループの仕方
-
複数条件に当てはまる行の抽出...
-
sqlのwhereで指定した条件の前...
-
教えて下さい。m(__)m
-
sumやcount関数について
-
通番を振りたい
-
distinct句を使わずレコード総...
-
副照会を簡単に使いまわせますか?
-
PL/SQLの基礎的な質問ですが・・
-
SQL:外部結合について
-
SQLのCOUNT件数表示について
おすすめ情報