人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

oracleのSQLでクロス集計を行いたいと思います。
列が固定している場合は、
SELECT JOB,
SUM(DECODE(MGR,7566,SAL,0)) ”7566”,
SUM(DECODE(MGR,7698,SAL,0)) ”7698”,
SUM(DECODE(MGR,7782,SAL,0)) ”7782”,
SUM(DECODE(MGR,7902,SAL,0)) ”7902”,
SUM(DECODE(MGR,7839,SAL,0)) ”7839”
FROM EMP
GROUP BY JOB;
このような感じになると思いますが、
列が固定されていない場合は、どのようにすればよいか分かりません。
ご存知の方、教えてください。

●質問者: doogie
●カテゴリ:コンピュータ
✍キーワード:GROUP Oracle SELECT SQL クロス
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● UhYahTa
●40ポイント

http://oshiete1.goo.ne.jp/kotaeru.php3?q=1087133

[教えて!goo] 動的SQL

「列が固定されていない」とはどのような状況なのかいまいちよく分かりませんので、誤解しているかもしれませんが、PL/SQL上で任意のフィールドに対してSELECT文を発行したい、とのご質問だと解釈しました。

(外していましたら、ポイントは結構です)


2通り思い付きましたが、まず1番目は動的SQLで実行時に解釈させる方法です。

DBMS_SQLパッケージを使う方法が一般的ですが、Oracleのバージョンによっては、EXECUTE IMMEDIATEなど、より便利な機能が使えることもありますので、詳しくはマニュアルをご参照ください。

なお、動的SQLでSELECT文を処理する場合は結構煩雑になることが多いですし、SQL文解析のオーバーヘッドもばかになりませんので、ご注意ください。


2番目の方法は、汎用的に処理できるようTEMP表を用意し、そのTEMP表に状況に応じて適切なデータを流し込んでからクロス集計する、という方法です。

ただ、状況がよく分かりませんのでこれ以上具体的な説明が困難です。


はっきりした回答でなく申し訳ありませんが、ご参考になりましたら。

◎質問者からの返答

UhYahTa様ご回答ありがとうございます。

質問内容が分かり難くてすいません。

上記のSQLだとDECODE文が5個と固定ですが、この数が6個になったり10個になったりと固定でない場合です。

上記の回答でTEMP表を使う方法で考えてみようと思います。

有難う御座いました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ