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;
このような感じになると思いますが、
列が固定されていない場合は、どのようにすればよいか分かりません。
ご存知の方、教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/10/17 13:14:23
  • 終了:--

回答(1件)

id:UhYahTa No.1

UhYahTa回答回数8ベストアンサー獲得回数02005/10/17 20:14:17

ポイント40pt

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

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


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

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

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


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

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


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

id:doogie

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

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

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

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

有難う御座いました。

2005/10/18 09:17:58

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません