• ベストアンサー

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 得意先.得意先コード ";

  • Java
  • 回答数5
  • ありがとう数3

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

  • ベストアンサー
  • 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」を得たいのですが,得られた結果は「受注」に存在する得意先のみとなってしまっています。

関連するQ&A

  • 集計についてのSQLの組み立て方

    SQLについての質問です。 MySQLを使っています。 1か月間の得意先別の入金の集計を取りたいと思っています。 表としては以下のような感じです。 ID  得意先名  現金計 振込計 相殺計 手数料計  合計 =========================================================== 001 aaaaaaa   30,000  40,000  25,000    840  95,840 002 bbbbbbb   10,000  20,000  30,000    420  60,420 SELECT * sum(nyukin) AS genkin FROM nyukin_meisai WHERE tokuisaki_id = '001' AND nyukin_kubun = '現金' AND uriage_bi BETWEEN '2014/05/01' AND '2014/05/31' SELECT * sum(nyukin) AS furikomi FROM nyukin_meisai WHERE tokuisaki_id = '001' AND nyukin_kubun = '振込' AND uriage_bi BETWEEN '2014/05/01' AND '2014/05/31' 以下続く と得意先毎/各区分ごとに一つひとつSQLを発行すればできるんでしょうけど、 これをひとつのSQLで実現したいと思っていますがSQLをどのように組み立て てよいものやら困っています。 case を組み込んだりしてもうまくいきませんでした。 どなたかご指導下さい。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 集計結果を別テーブルに更新クエリで書き出したい。

    Access2000を使っています。 テーブルとフィールドの関係は次のようになっています。 (一部、Northwind.mdbを使っています。) 受注 ---------------------- 得意先コード 受注コード 受注明細 ---------------------- 受注コード 単価 数量 売上集計 ---------------------- 得意先コード 合計 受注明細テーブルの単価と数量を掛け合わせたものの合計を 売上集計テーブルの合計に書き出したいと思います。 次の選択クエリの合計の値を売上集計テーブルの取引先コード の一致する場所に書き出したいのです。 SELECT 受注.得意先コード, Sum([単価]*[数量]) AS 合計 FROM 受注 INNER JOIN 受注明細 ON 受注.受注コード = 受注明細.受注コード GROUP BY 受注.得意先コード; 売上集計テーブルと受注テーブルの得意先コードは同じものが 存在します。 よろしくお願いします。

  • SQLで違うテーブルの結果を組み合わせたい

    SQLでどう結果を返したらいいのかわからないので力を貸してください。 下記の受注表と入荷表があります。 受注表 担当 商品コード 顧客コード ── ──── ───── 田中 A1 001 田中 A1 002 田中 A1 003 山田 A2 020 山田 A1 003 田中 A1 020 入荷表 担当 入荷コード 入荷日 ── ───── ───── 山田 X013 20080701 山田 X013 20080701 田中 X013 20080701 山田 X013 20080630 山田 X013 20080630 田中 X123 20080630 自分の欲しい結果を出すためのSQLは下記のクエリです。 ≪受注表テーブルから≫ SELECT 担当, 顧客コード FROM 受注表 WHERE 担当 = '田中' AND 商品コード = 'A1' AND 顧客コード = '003' ; SELECT 担当, 顧客コード FROM 受注表 WHERE 担当 = '田中' AND 商品コード = 'A1' AND 顧客コード = '020' ; ≪入荷表テーブルから≫ SELECT 担当, 入荷日 FROM 入荷表 WHERE 担当 = '田中' AND 入荷コード = 'X013' AND 入荷日 = '20080701' ; SELECT 担当, 入荷日 FROM 入荷表 WHERE 担当 = '田中' AND 入荷コード = 'X123' AND 入荷日 = '20080630' ; これらで出る結果をただ下記のように横並びに出したいのですがどうしたらよいでしょうか? 「担当」の項目に関しては複数でますが気にしないで下さい。 ただ全く関係のないテーブル同士の結果を「横並び」表示にしたいだけです。 担当 顧客コード 担当 顧客コード 担当 入荷日 担当 入荷日 ── ───── ── ───── ── ──── ── ───── 田中 003 田中 020 田中 20080701 田中 20080630

  • sqlについて

    下に書いたsqlのコードの内容(どういう処理でどういう結果になるのか)が知りたいです。 どなたかわかる方教えてください。 select b.ym, b.no,     isnull(e.sumcnt,0)as val, null as bunsi, null as bunbo from (select distinct ym,no from Table_A)b inner join (select ym from Table_B where cd=1)d on b.ym=d.ym left outer join (select b1.ym,b1.no,sum(c1.cnt)as sumcnt from Table_A b1 inner join (select ym from Table_B where cd=1)d1 on b1.ym=d1.ym inner join Table_C c1 on b1.ym=c1.ym group by b1.ym,b1no)e on b.ym=e.ym and b.no=e.no

  • SQLでの集計について

    こんにちわ。以下のようなテーブルから条件に見合う合計を出したいと思いSQLを書いてみたのですが、 思った結果になりません。 テーブルA ID1 得意先Cd 営業所Cd 日付 1  001    001  2005/09/01 2  001    002  2005/09/01 3  001    001  2005/09/03 テーブルB ID2 ID1 部署 数量 金額 1  1  01  1  1000 2  1  01  1  1000 3  1  02  1  1000 4  2  01  1  1000 5  2  01  1  1000 6  3  01  1  1000 7  3  01  1  1000 8  3  02  1  1000 [抽出結果] 得意先Cd 営業所Cd 日付  部署 数量(Sum) 金額(Sum) 001    001  2005/09/01 01   2   2000 001    001  2005/09/01 02   1   1000 001    001  2005/09/03 01   2   2000 001    001  2005/09/03 02   1   1000 001    002  2005/09/01 01   2   2000 [SQL] select 得意先Cd,営業所Cd,日付,部署,SUM(数量) As '数量計',SUM(金額) As '金額計' from テーブルA AA Inner join テーブルB BB ON (AA.ID1 = BB.ID1) group by 得意先Cd,営業所Cd,日付,部署,数量,金額 order by 得意先Cd,営業所Cd,日付,部署 このSQLを実行すると、日付、部署共に同じ場合でも数量・金額が合計値となりません。 得意先Cd 営業所Cd 日付  部署 数量 金額 001    001  2005/09/01 01 1  1000 001    001  2005/09/01 01 1  1000 どのように変更を加えれば、上記の「抽出結果」にできるのでしょうか? よろしくお願いいたします。

  • SQL文を教えて下さい

    VB2008、SQL Server で開発をしています。 下記の条件でデータを取得したいのですが、SQL文がうまくできず、困っています。 おわかりの方、教えてください。 仕様:得意先マスタ(得意先M)の全件と、売上テーブル(売上T)を読みます。     売上テーブルの商品コードの商品名を商品マスタ(商品M)より取得します。     得意先マスタの全得意先を取得する必要があります。     すべての得意先の売上データが存在するわけではありません。 ACCESS上でクエリを作成し、SQLビューにすると、こうなります。 inptSyoCD:画面から入力した商品コード 1,まず、クエリ1: SELECT 売上T.伝票日付, 売上T.伝票番号, 売上T.得意先コード, 売上T.明細区分, 売上T.商品コード, 商品M.商品名称 FROM 売上T LEFT JOIN 商品M 売上T.商品コード = 商品M.商品名 WHERE 売上T.明細区分=1 AND 売上T.商品コード= inptSyoCD ; 2,次に、実際に処理するSQL文: SELECT 得意先M.得意先コード, 得意先M.得意先名称,       クエリ1.伝票日付, クエリ1.伝票番号, クエリ1.明細区分, クエリ1.商品コード, クエリ1.商品名  FROM 得意先M LEFT JOIN クエリ1 ON 得意先M.得意先コード = クエリ1.得意先コード ORDER BY 得意先M.得意先コード,売上T.伝票日付,売上T.商品コード; この2つをひとつのSQL文にする方法がわかりません。 よろしくお願いいたします。

  • 日付範囲の取得     早めにお願い!

    データを取得したいです SQLで2004/10/01と2004/10/11が入力されてないときに 選択したデータが取れるようにしたいんですがどうしたらいいですか。 丁度WHERE分のところですが SQL Server Management Studio Express使用 select '1' as 端末番号, 受注残.*, 取引先.取引先略名, 担当者.担当者番号, 担当者.担当者名, 区分明細.区分明細名, 区分明細1.区分明細名, 区分明細2.区分明細名, 取引先1.取引先略名 as 取引先略名1, 受注残.品目分類, 名称.名称名, '2', '3' from 受注残 LEFT JOIN 取引先 on 受注残.得意先番号 = 取引先.取引先番号 LEFT JOIN 担当者 on 受注残.売上担当者 = 担当者.担当者番号 LEFT JOIN 区分明細 On ( 受注残 .受注伝票区分 = 区分明細.区分明細番号) LEFT JOIN 区分明細 as 区分明細1 On (受注残.仮単価区分 = 区分明細1.区分明細番号) LEFT JOIN 区分明細 as 区分明細2 On (受注残.完納区分 = 区分明細2.区分明細番号) LEFT JOIN 取引先 as 取引先1 on (受注残.得意先番号 = 取引先.取引先番号 ) left join 名称 on 受注残.品目分類 = 名称.名称番号 where ('00001' = '99999' OR ('00001' <> '99999' AND 受注残.工場番号 = '00001')) AND 受注残.受注日 >= '2004/10/01' AND 受注残.受注日 <= '2004/10/11' AND 受注残.受注日 between '2004/10/01' and '2004/10/11' AND (区分明細.区分番号 = '01' Or 区分明細.区分番号 Is Null) AND (区分明細1.区分番号 = '40' Or 区分明細1.区分番号 Is Null) AND (区分明細2.区分番号 = '10' Or 区分明細.区分番号 Is Null) AND 取引先1.取引先番号 = '00001' AND 受注残.得意先番号 = '143500-03' and 名称.区分番号 like '%65%' and 名称.名称番号 like '%'+'0010'+'%' order by 受注残.工場番号, 受注残.受注日, 受注残.品目番号

  • クエリにSQL文を書き込みたい

    アクセス2000にてソフト開発しています Q受注グラフというクエリがあります。 データが毎月変化するので、これにVB内に記述したSQL文を書き込みたいのですが、どの様にすれば いいのでしょうか ちなみにSQL文は下記です。 SQL = "SELECT JS.受注年月, JS.部署名, JS.当月受注実績 AS 当月, " & _ "(JY.請負1*10000) AS " & m当月 & ", (JY.請負2*10000) AS " & m翌月 & ", (JY.請負3*10000) AS " & m翌々月 & ", " & _ "FORMAT((JS.受注達成率*100),""###.#"") AS [受注達成率(%)]" & _ "FROM T受注実績集計 AS JS INNER JOIN (T受注予定集計 AS JY INNER JOIN 部署コード AS BC ON JY.部署コード = BC.施工部署コード) " & _ "ON (JY.部署コード = JS.部署コード) AND (JY.実績年月 = JS.受注年月)" & _ "WHERE JS.受注年月 = '" & m実績月 & "'" & _ "ORDER BY BC.部署コード;" 宜しく御願いします

  • テーブルの集計値を別テーブルに更新したいのですが

    mysql+PHPを利用していますが、表記の件で数日間悩んでおります。 実際に可能な操作かどうかもわかりません。 よいお知恵があったら教えてください。 下のようなテーブルがそれぞれあります。 table1 ID・得意先コード・受注内容・受注金額 1・   28  ・ xxxx ・ 10000 2・   32  ・ aaaa ・  5000 3・   28  ・ YYYY ・ 20000 4・   15  ・ tttt ・ 15000 5・   32  ・ kkkk ・  3000 (得意先コードはtable2のIDです) table2 ID・得意先名・受注金額合計 15・ BBB・ 28・ CCC・ 32・ DDD・ PHPファイルを実行する度に、 「table1」の「受注金額」を「得意先コード」ごとに集計した各値を、「table2」の各「受注金額合計」にそれぞれ更新していきたいと思っています。 色々調べたところ以下の構文が紹介されていたので試してみました。 Update table2 set 受注金額合計 = (select sum(受注金額) from table1 INNER JOIN table2 ON table1.得意先コード = table2.ID) すると「#1064 - You have an error in your SQL syntax」というエラーが出てしまいました。select以降の構文が良くないらしいのですが、私の書き方が悪いのか、それすらもわからない状態です。 MySQLは4.0.24、PHPは4。レンタルサーバーを利用しています。 なにとぞよろしくお願いします。

  • 意味は同じはずなのに結果が違います。

    SELECT * FROM テーブルA LEFT OUTER JOIN ( SELECT * FROM テーブルB WHERE テーブルB.列X IS NOT NULL) as テーブルB ON テーブルA.列A = テーブルB.列A SELECT * FROM テーブルA LEFT OUTER JOIN テーブルB ON テーブルA.列A = テーブルB.列A WHERE テーブルB.列X IS NOT NULL 上のSQLも下の同じ事をしてると思うのですが 上では検索結果が10件出た場合 下では0件になってしまいます。 SQL自体シンプルで間違っていないと思うのですがなぜでしょうか?

専門家に質問してみよう