- ベストアンサー
貸家のデータベース
Branch(branchNo, street, city, postcode)と PropertyForRent(propertyNo, street, city, postcode, type, rooms, rent, ownerNo, staffNo, branchNo)というデータベースがあります。 OracleでbranchNoをキーにして各ブランチごとの現在の貸家の金額(rent)を集計、そして最後に全部のブランチの合計金額を集計したいのです。 すべてのブランチを表示させたい(今貸している部屋のないブランチも含め)のですが、私が作ったものだと、現在貸している部屋のあるブランチしか表示されません。また、全体の合計金額もどうやって出せばいいのか悩んでいます。sumを使うのでしょうが、各々のブランチの合計でsumを使ってしまうと、全体の合計が出せなくなってしまうのです。。これは、ただ単に私のOracle使用暦が浅いためにわからないのか、根本的な作り方が悪いのかわかりません。 お手数おかけしますが、ご回答よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
E-R図が無いので、お答えしにくいのですが。 まずは、テーブルが正規化されてないと思います。 street, city, postcodeという項目が、BranchとPropertyForRentの両方にあります。 もし、上記の3つの項目がbranchNoで一意に決まるのなら、PropertyForRentには当該項目がいりません。 その他にもPropertyForRentから、Branchに移した方がよい項目がありそうな気がします。(このままでは、第1正規化の状態です) テーブルは他の人が定義したもので、変更できないとして、BranchとPropertyForRentがranchNoで結び付けられ、1対多の関係にあると仮定すると、「すべてのブランチを表示させたい」場合は、以下の様になると思います。 (時間が無いので、実際には確認していませんので一寸自信がありませんが) SELECT A.branchNo, A.street, A.city, A.postcode, SUM(B.rent) FROM Branch A, PropertyForRent B WHERE A.branchNo = B.branchNo(+) GROUP BY A.branchNo, A.street, A.city, A.postcode また、全ての合計は SELECT SUM(rent) FROM PropertyForRent で表示可能です
その他の回答 (1)
- taka451213
- ベストアンサー率47% (436/922)
こんにちは。 全体像がわからないのと、Oracleのバージョンがわからないので、ちょっと???なんですが・・・、 PARTITIONとかCUBEを使えばいいのでは? 集計関数(構文)はSUMだけじゃないですよ。 (^^ゞ
お礼
テーブルがたくさんあったため、要点だけ省いて説明してしまいました。また、Oracleは、9iを使っていました。説明不足ですみません・・・。 Oracleはまだ初めて1ヶ月で、実は今回が初めて実際に動かしてみる段階なのです。もっと本を読み込まないとだめだなと思いました。集計関数についてもっと調べてみます。ありがとうございました。
お礼
テーブルはその二つだけではなくて、他にももっとあるので、それを見ていただければもっとよくわかっていただけたのでしょうが・・・すみません。 いずれにせよ、私がテーブルをいじることはできないので、早速教えてくださったとおりに試してみようと思います。ありがとうございます。
補足
うまく動かすことができました。が、すべての合計は、全部を表示させた後(一番最後の列)に表示させたいのです。 縦の列に加えることはできるのですが、最後にそれをプラスさせるにはどうしたらいいのでしょうか