- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複雑な2表の結合について)
複雑な2表の結合について
このQ&Aのポイント
- 2つの表を結合し、特定の条件で集計を行いたい場合のSELECT文の作成方法を教えてください。
- 表Aと表Bの関連付けにより、ROOM_CODE、ID、合計金額を返すSELECT文を作成したいです。
- ORACLE9iのSQLPLUSを使用して、表Aの特定の列と表Bの特定の列を結合し、結果を返すSELECT文の作成方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ビューにしたわけですね。今回のビューのレイアウト(厳密にはID,DATE,ROOM_NO)でテーブルを用意し、 そこから表Aのようなビューを作成するのが通常のデザインだと思います。 ちなみに表Aのレイアウトだと、PL/SQLでやってもあまり楽にはならないです。 PL/SQLで別アプローチを取るとしても、CAL01からCAL31までをデリミタ付で結合した文字列から、 指定ROOM_NOの登場件数をカウントする関数を作成するくらいですね。
その他の回答 (1)
- jamshid6
- ベストアンサー率88% (591/669)
回答No.1
コメントが付かない理由は明らかで、 ・「CAL01~02の個数」「CAL01~29の個数」「CAL31の個数」などの集計範囲が何によって決まっているのか ・「個数」の定義 がわからないからです。 いずれにしても表Aのような構造(繰返し項目が存在するので非正規形です)である以上、NVL(CAL01,0)+NVL(CAL02,0)+.....+NVL(CAL29,0)のような相当ムゴいクエリになるのは不可避と思います。
お礼
コメントありがとうございます。 「個数」という表現が悪かったですね。。 それと何のための表かという説明がないのでイメージができなかったと思います。申し訳ありませんでした。 まず、表AのCAL01~31はカレンダーの1日から31日で、IDごとにそれぞれの日にいた部屋No.が格納されています。 それで最終結果として、部屋ごとのIDごとに合計金額を算出したいわけで、ID=1の場合ですと、CAL01~29に部屋No.=1におり、CAL30,31に部屋No.=2にいます。ID=2は、CAL01,02に部屋No.=1に、CAL03~CAL30に部屋No.=2に、CAL31に部屋No.=3にいます。 結論として、以下のような中間ビューを作成し、表Bと結合することで解決しましたが、PL/SQL等を使ってもっとスマートに書くことは可能なのでしょうか? create or replace view VIEW_XXXX ( ID,YYYYMMDD,ROOM_NO ) as (select ID,YYYYMM || '01',CAL01 from 表A union all select ID,YYYYMM || '02',CAL02 from 表A union all select ID,YYYYMM || '03',CAL03 from 表A ・ ・ ・ );