• ベストアンサー

SQLでの集計結果取得について

以下のようなSQLを書いたのですが,ほしい結果が得られませんでした。 受注に存在しない得意先についても得意先コードと得意先名を得たかったので、 "from 受注 Right Outer Join 得意先 On 受注.得意先コード = 得意先.得意先コード" としたのですが, 受注に存在しない得意先についてはデータが得られませんでした。さらに、Where句で、"受注.得意先コード =* 得意先.得意先コード"と書くとエラーが出てきてしまいました。 どうすれば得意先に存在する得意先すべての集計結果が得られるのでしょうか? String sql = "Select 得意先.得意先コード, Min(得意先.得意先名) " + "As 得意先名, Sum(受注.受注合計金額) " + "from 受注 Inner Join 得意先 " + "On 受注.得意先コード = 得意先.得意先コード " + "where 受注.得意先コード = 得意先.得意先コード " + "and 受注状態区分 = '" + joutaiKubun + "' " +      "and 納入日 between '" + startYMD + "' and '" +        "endYMD + "' " + "Group By 得意先.得意先コード " +      "Order By 得意先.得意先コード ";

質問者が選んだベストアンサー

  • ベストアンサー
  • hidebu-
  • ベストアンサー率53% (45/84)
回答No.5

副問い合わせとはクエリーを発行して得られた結果をテーブルとみなしてSQL文に組み込むことができることを指します。 これを利用してまずは SELECT 受注.得意先コード AS 得意先コード, Sum(受注.受注合計金額) AS 受注合計金額 FROM 受注 GROUP BY 受注.得意先コード; で受注金額を得意先毎に集計した結果が得られますね? これを「集計結果」テーブルとして定義します (SELECT 受注.得意先コード AS 得意先コード, Sum(受注.受注合計金額) AS 受注合計金額 FROM 受注 GROUP BY 受注.得意先コード) AS 集計結果 、で結果を「集計結果」テーブルとして扱えます。 そして得意先テーブルと外部結合します。 SELECT 得意先.得意先コード, 得意先.得意先名, 集計結果.受注合計金額 FROM 得意先 LEFT JOIN (SELECT 受注.得意先コード AS 得意先コード, Sum(受注.受注合計金額) AS 受注合計金額 FROM 受注 GROUP BY 受注.得意先コード) AS 集計結果 ON 集計結果.得意先コード = 得意先.得意先コード; で期待の結果を得ることができます。 ちなみに受注情報がないところの「集計結果.受注合計金額」はNULL値がかえってきますので0に変換するロジックを作成するのをわすれずに。 長い説明になりましたが、ご理解いただけたでしょうか?

taganyan
質問者

お礼

とってもよくわかりました。 超感激です!! 本当にありがとうございました。

その他の回答 (4)

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.4

的外れかも知れませんが。 where句の中で「受注.得意先コード = 得意先.得意先コード」というのがあって、 これが邪魔しているのではないのでしょうか。これだと受注にない得意先は無視されてしまうような気が・・・。 受注に存在するものと存在しないものを別々のselect文にしてunionでつなぐ必要があるのではないでしょうか。

  • hidebu-
  • ベストアンサー率53% (45/84)
回答No.3

1、クエリーを発行したときに例外はなげられなかったと仮定していいんでしょうか? 2、質問文で上の説明では外部結合を使ったみたいなことをかいていますが、下のソースでは内部結合をつかってるのはどうして? 正確な情報がないのでなんともいえませんが、副問い合わせと外部結合をつかえばすんなりいくとおもいます。 ちなみに例外を投げられていないのなら今回の場合、JDKの種類やJDBCのバージョン、RDBの種類は特に関係がないです。 オートコミットをfalseにしてるわけでもなさそうですし。 方言の違いにでくわしたら、例外をなげますしね。 以前、あるJDBCドライバーで接続はできるがクエリー発行ができないという酷いバグがありましたがそういうものでもなさそうですし(これも例外をなげましたし。ドライバがトレースを出力しますんで)。 でも、どんな場合でもそうですが、 使用している環境や開発ツールなどを記述したほうが正確で詳細な回答を得られますよ^^;

taganyan
質問者

補足

回答どうもありがとうございます。 先ほどの訂正で、使用しているのはJDBC2.1です。すみません。。 >1、クエリーを発行したときに例外はなげられなかったと仮定していいんでしょうか? 外部結合で,=*を使用した場合は例外がThrowされました。 Right Outer Join と書いた場合は大丈夫でした。 >2、質問文で上の説明では外部結合を使ったみたいなことをかいていますが、下のソースでは内部結合をつかってるのはどうして? 外部結合をしても、内部結合の場合とまったく同じ結果が得られました。 これがどうしてなのかわからないのですが。。。 「副問い合わせ」というのはどのようなものですか?

  • yuji
  • ベストアンサー率37% (64/169)
回答No.2

ANo.#1の人の質問の回答になっていません。 使用するRDBMSによって、実行できるSQLは変わってきます。 対象にしているRDBMSは何ですか? ・Oracle ・SQL Server ・MS Access さらに、種類だけでなくバージョンも書くようにしてください。 それと、JDBCもバージョンによって異なります。 JDKのバージョンは? 使っているJDBCのバージョンは? これらがないと回答できません。

taganyan
質問者

補足

ご親切にありがとうございます。 RDBMS:MS Access 2000 JDBC:JDBC1.2 JDK:J2SDK1.4.0_01 を使用しています。

  • 7_7_7
  • ベストアンサー率24% (115/469)
回答No.1

RDBの種類およびバージョン、DBの内容がわからないので回答のしようがありません。 もう少し詳しくわかれば回答できるのですが...

taganyan
質問者

補足

JDBCです。 JavaでSQL文を発行して,その結果を表示させたいのですが、そのSQL部分のみを抜粋してあります。 データベースには、「受注」、「得意先」というテーブルがあります。 「受注」のフィールドは、受注番号・得意先コード・受注合計金額・消費税額・受注明細件数・納入日・受注日・状態区分。 「得意先」のフィールドは、得意先コード・得意先名・電話番号・郵便番号・住所。 「受注」には、受注を受けた得意先の得意先コードとその金額などが登録されています。集計では、得意先ごとに受注合計金額を集計したいのですが,その際に,受注をまったく受けてない得意先についても,集計結果「¥0」を得たいのですが,得られた結果は「受注」に存在する得意先のみとなってしまっています。

専門家に質問してみよう