• ベストアンサー
  • すぐに回答を!

group byにより集計した結果での名称取得方法

次のようなテーブルがあったとして、一回のSQLで商品名称とその売上件数の一覧を作成することは可能なのでしょうか? 【売上テーブル】 ID 販売日 商品ID 0001 2011/01/01 1 0002 2011/01/01 2 0003 2011/01/03 1 0004 2011/01/10 1 0005 2011/01/12 2 ・・・ 【商品マスタ】 ID 商品名 1 りんご 2 みかん 3 いちご 【最終的に作成したい一覧】 商品名 件数 りんご 3 みかん 2 いちご 0 ※売上テーブルに存在しない商品についても、件数が0件として一覧に出力出来るようにしたいです。 select 商品ID from 売上テーブル group by 商品ID にて商品ID毎の件数を算出し、それとは別に select ID,商品名 from 商品マスタ として、商品IDと名称のリストを取得後、アプリにてこれらの情報を突き合わせれば実現できるのは分かるのですが、これらの処理を一回のSQLにまとめることは可能なのでしょうか? よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数1798
  • ありがとう数5

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

  • ベストアンサー
  • 回答No.1
noname#210417

商品マスタをメインにして売上テーブルを左外部結合すれば、1回のSQLでデータ取得できるはずです。 select 商品マスタ.商品名,Count(商品マスタ.商品名) from 商品マスタ left outer join 売上テーブル where 売上テーブル.商品ID = 商品マスタ.商品ID group by 商品マスタ.商品名 こんな感じのSQL分でお望みの結果が出ると思うのですが・・・SQL Serverの環境がないので検証出来ません。

参考URL:
http://uchukamen.com/SQL2005/Select/Select.htm

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答頂きどうもありがとうございます。 ご教授頂いたSQLだと私もうまくいくような気がしていたのですが、実際に試してみると、なぜか0件のものについては表示されません。(LEFT JOINをRIGHT JOIN、INNER JOINに変更してみても駄目でした) group byの場合は左外部結合がうまくきかないことがあるのでしょうか?

質問者からの補足

ご回答頂きどうもありがとうございました。 あれから試行錯誤した結果、次のようなSQLで実現できました。 SELECT 商品ID ,商品名 ,isnull(tbl.件数, 0) 件数 from (select 商品ID, COUNT(*) 件数 from 売上テーブル group by 商品ID ) as tbl right join 商品マスタ on 商品マスタ.商品ID = tbl.商品ID

関連するQ&A

  • INNER JOINしてGROUP BYしたいんですが

    はじめまして。Oracle初心者です。非常にハマって困っています。 テーブルAとBがあります。Aには商品の一覧が、Bには商品の複数の属性が格納されており、AとBをJOINすると、結果に商品が重複して含まれてしまいます。 SELECT A.商品名,B.属性 FROM A INNER JOIN B ON A.商品ID=B.商品ID; 結果 ------- 商品名1,属性あ 商品名1,属性い 商品名1,属性う 商品名2,属性あ .... テーブルBを使って、「属性あ」を持たない重複しない商品名の一覧を取得したいのですが、 SELECT A.商品名,A.商品ID FROM A INNER JOIN B ON A.商品ID=B.商品ID AND B.属性!='属性う' GROUP BY A.商品名,A.商品ID これでできそうな気がするのですが、エラーになってしまいます。 本当はさらにWHEREをつけて SELECT A.商品名,A.商品ID FROM A INNER JOIN B ON A.商品ID=B.商品ID AND B.属性!='属性う' GROUP BY A.商品名,A.商品ID WHERE A.商品名 like 'あ%'; とかもしたいのですが。。 Oracleは10gです。 解決策を教えていただきたく、よろしくお願いします。

  • 集計

    品番 商品名 売上 384 りんご 190 204 みかん 50 384 りんご 130 204 みかん 200 109 バナナ 95 こういう一覧が100行ぐらいあります。 品番ごとの売りげ合計の一覧を作るにはどうすればいいですか?

  • GROUP BY句について

    SQL_PLUSでの質問です。 以下のSELECT句があります。 GROUP BY句の『'A' AS 区分』は必要なのでしょうか。 ----------------------------- SELECT 商品コード AS 商品コード, 商品名 AS 商品名, 'A' AS 区分, SUM(金額) AS 金額 FROM 売上トラン GROUP BY 商品コード AS 商品コード, 商品名 AS 商品名, 'A' AS 区分; ----------------------------- 何気なくプログラムを見ていたら、目に留まりました。 このままでもコンパイルは通るので問題はないのですが、 決まった値を設定しているのだから、必要ないような気がするのです。 環境はWin2000 Oracle 9i です。 ご存知の方、教えて下さい。

その他の回答 (2)

  • 回答No.3

> 【商品マスタ】 > ID 商品名 とあるのに、試されているSQLでは「商品マスタ.商品ID」になっているのが気になります。 テーブルのカラム名について確認されてはいかがですか。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答頂きどうもありがとうございます。 あれから試行錯誤した結果、次のようなSQLで実現できました。 SELECT 商品ID ,商品名 ,isnull(tbl.件数, 0) 件数 from (select 商品ID, COUNT(*) 件数 from 売上テーブル group by 商品ID ) as tbl right join 商品マスタ on 商品マスタ.商品ID = tbl.商品ID

  • 回答No.2

以下のソースをご参考ください。 SELECT   商品マスタ.商品名,   COUNT(*) FROM   商品マスタ LEFT OUTER JOIN   売上テーブル ON 商品マスタ.商品ID = 売上テーブル.商品ID GROUP BY   商品マスタ.商品ID,   商品マスタ.商品名

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答頂きどうもありがとうございます。 ご教授頂いたSQLだと私もうまくいくような気がしていたのですが、実際に試してみると、なぜか0件のものについては表示されません。(LEFT JOINをRIGHT JOIN、INNER JOINに変更してみても駄目でした) group byの場合は左外部結合がうまくきかないことがあるのでしょうか?

質問者からの補足

ご回答頂きどうもありがとうございました。 あれから試行錯誤した結果、次のようなSQLで実現できました。 SELECT 商品ID ,商品名 ,isnull(tbl.件数, 0) 件数 from (select 商品ID, COUNT(*) 件数 from 売上テーブル group by 商品ID ) as tbl right join 商品マスタ on 商品マスタ.商品ID = tbl.商品ID

関連するQ&A

  • group by句

    色々と試行錯誤してやっていますが、なかなか自分の 思うような結果が得られないためご質問させて下さい。 テーブルが全部で3つあります。 テーブルA id name 1 巨人 2   西武 テーブルB id name 1 小笠原 2 ラミレス 3 中島 4  片岡 テーブルC id テーブルAID テーブルBID 背番号 1 1 1 30 2 1 2 10 3 2 3 3 4 2 4 8 テーブルを結合し、テーブルCにある 背番号をテーブルAid,テーブルBidを元に sumしたいのですがうまくいきません。 以下がそのSQLになります。 (1)サブクエリーを使ったSQL この場合値が重複されて表示されてしまいます。 select a.name,b.name,c.name, (select sum(背番号) from tableC c where c.テーブルAId = a.id group by c.テーブルAid ), (select sum(背番号) from tableC c where c.テーブルBid = bid group by c.テーブルBid ) from tableC c inner join tableA a on a.id = c.テーブルAid inner join tableB b on b.id = c.テーブルBid (2) select a.name,b.name,c.name, (select sum(背番号) from tableC c where c.テーブルAId = a.id ), (select sum(背番号) from tableC c where c.テーブルBid = bid ) from tableC c inner join tableA a on a.id = c.テーブルAid inner join tableB b on b.id = c.テーブルBid group by c.テーブルAid 重複はされないのですが、group byが一つのみなので ちゃんとした出力がされません。    他にやり方があるのかもしれませんが、お分かりになる方が    いらっしゃいましたら、ご教授お願い致します。

  • SQLで実現出来るものか教えてください(別途、プログラムが必要?)

    SQLで実現出来るものか教えてください(別途、プログラムが必要?) Accessで、下記の様な二つのテーブルがあります。 【テーブルA:データテーブル】 テーブルAの1レコード目~「新商品コード:001;002;999」「商品名一覧:みかん」 テーブルAの2レコード目~「新商品コード:002;003;999」「商品名一覧:いちご」 【テーブルB:新果物マスタ】 テーブルBの1レコード目~「新商品コード:001」「商品名:バナナ」 テーブルBの2レコード目~「新商品コード:002」「商品名:レモン」 テーブルBの3レコード目~「新商品コード:003」「商品名:パイン」 テーブルBの4レコード目~「新商品コード:999」「商品名:その他」 テーブルAの新商品コードに該当する商品名を、テーブルBから取得して、 テーブルAの商品名一覧に加えたいのですが、どんなSQLで出来るでしょうか? <欲しい結果> テーブルAの1レコード目~「新商品コード:001;002;999」「商品名一覧:みかん、バナナ、レモン、その他」 テーブルAの2レコード目~「新商品コード:002;003;999」「商品名一覧:いちご、レモン、パイン、その他」

  • SQLで乱数を使った取得の工夫

    お世話になります。 ID,name,point 1.りんご.30 2.みかん.22 3.いちご.18 4.バナナ.13 5.すもも.4 6.マンゴー.1 上記のようなデータがある場合、pointが高いほど 選ばれ易くするようなSQLを記述したいのですが、 その方法をお教えいただけないでしょうか。 ただのランダムであれば、『SELECT * FROM テーブル名 WHERE ID=abs(random()%全レコード数(この場合は6)+1』と すれば、均等にランダムで拾えますが、これを1のりんごのIDほど 取得しやすく、6のマンゴーほど発生しにくくするといった感じです。 以上、よろしくお願いいたします。

  • アクセスの2つのテーブルから重複しないものを抜き出す方法について

    アクセスの2つのテーブルから重複しないものを抜き出す方法について 例えば テーブル Aには ID   価格    商品   1  200    りんご   2  150    みかん   3  180    りんご   4  230    いちご テーブル Bには   1  150    みかん   2  180    りんご とあった場合 A-B のクエリーを実行して   1  200    りんご   2  230    いちご という結果を得たいのですが、どのようにすれば出来るのでしょうか よろしくお願いします。

  • SQLのcount()とgroup by

    以下のようなテーブルがあったとき、 tbl1 id | score 1 | 100 1 | 200 1 | 300 2 | 200 2 | 100 3 | 300 3 | 400 3 | 500 3 | 600 idでまとめて個数を出すとすると、 SELECT count(*) FROM tbl1 group by id とすれば count(*) 3 2 4 と結果が返ってきますが、この結果にidを足して id | count(*) 1 | 3 2 | 2 3 | 4 というようなSQLはどうやって書けばいいのでしょうか? MySQLでは、 SELECT id, count(*) FROM tbl1 group by id と書けるのですが、これは標準的なSQLではNGなそうなので、気になって質問しました。 よろしくお願いします。

  • group by句

    以下のSQL文がoracle9iでOKで8iで通らないのですが、8iでも通るようになんとかできないでしょうか。 select a.val_Id, (select val_nm from tableA where val_id = a.val_id) as val_nm from tableA a group by a.val_id テーブルの内容 tableA( val_id number(1,0), val_code number(2,0), val_nm varchar(10) ) val_idとval_codeで一意となっています。 val_nmはval_idと一対一になっています。 要するにval_idに対応するval_nmも一緒に取得したいのですが、select句のサブクエリで8iの場合"group byの式ではありません"とおこられてしまいます。 ちなみに、今ここでは簡略化しているのですが本来は色なテーブルを結合しているので、単にgroup by val_id,val_nmとするのは無しでお願いいたします。 わかりにくいかとは思いますがお知恵をお貸しください。宜しくお願いいたします。

  • SQLのsum関数

    こんにちは。 PostgresのSQLが思うように動いてくれません!! そのIDを持っている人がどのくらいの数を持っているのかを抽出したいのです。 テーブルは下記です。 ********************************************* ★Aテーブル ID  名前  数  場所  日付 0001 みかん 1  冷蔵庫 0901 0001 みかん 4  倉庫  0901 0001 みかん 1  冷蔵庫 0901 0002 いちご 1  部屋  0901 0002 いちご 2  部屋  0801 0003 きのこ 6  倉庫  0901 ★Bテーブル ID  名前 0001 みかん 0002 いちご 0003 きのこ 0004 あいす ********************************************* となっている場合、下記SQLを実行すると select a.ID ,b.名前 ,sum(a.数) as 数 from Aテーブル a,Bテーブル b where a.日付 >= '0901' and a.日付 <= '0901' and a.ID = b.ID group by a.ID ,b.名前, a.数 結果が 0001 みかん 2 0001 みかん 4 0002 いちご 1 0002 いちご 2 となり0001は合計6で出て欲しいのに別々に出てしまいます。 理想では 0001 みかん 6 0002 いちご 3 で出て欲しいです。 たとえばこの場合、場所によってなど出てしまうものでしょうか? これはなぜなのでしょうか? よろしくお願いします。

  • 検索結果の件数表示

    商品情報が入ったテーブルから、一致した件数を求めて、商品名を一覧表示するSQLなのですが、件数を求めるのに時間がかかります。もっと早くする方法はないでしょうか? 登録されているのは700万件ぐらいで、件数を表示させるのに2.5秒、商品名を出すのは0.3秒くらいです。 select `商品名` FROM `商品情報` WHERE `商品名` LIKE '%検索ワード%' LIMIT 0 , 30 これで検索結果を求めて、 select count(`商品名`) FROM `商品情報` WHERE `商品名` LIKE '%検索ワード%' で一致した件数を求めています。 サーバのスペック メモリ1GB CPU2.66GHz

    • ベストアンサー
    • MySQL
  • 【SQL】group byについて

    SELECT A.商品名 B.商品名 FORM A,B WHERE ((A.店コード IN (引数.店コード)) and (A.商品コード IN(引数.商品コード)) AND (A.店コード = C.店コード) AND ((A.商品コード = D.商品コード) AND (A.店コード = D.店コード)) というSQLに下記条件を追加したいのですが、集計関数の使用方法がわかりません。 SELECT Sum(金額) FROM Q WHERE Q.店コード = A.店コード AND Q.商品コード = A.商品コード GROUP BY Q.店コード, Q.商品コード Qテーブルは 店コード、商品コード、メニューコード がKEYなのですが、 店コードと商品コードだけで集計した値をSELECTしたいのです。 恐れ入りますが、ご教授頂けますよう宜しくお願いします。

  • GROUP BYの記述方法について

    GROUP BYの記述方法について教えてください --------------------- 受注データ(テーブル) --------------------- 品目CD 受注数 00001  10 00001  10 00002  20 00002  15 --------------------- 品目マスタ(テーブル) --------------------- 品目CD 品目名 00001  えんぴつ 00002  けしごむ 00003  色鉛筆 上記二つのDBから、品目ごとの受注数の合計を取得するときのSQL文として、どうするのが正しいのでしょうか? --------------------- 欲しい結果 --------------------- 品目CD 品目名  受注数 00001 えんぴつ 20 00002 けしごむ 35 (考えられるSQL) CASE1:受注データの品目CDと品目マスタの品目名のグループ化 SELECT A.品目CD, B.品目名, SUM(A.受注数) FROM 受注データ A, 品目マスタ B WHERE A.品目CD = B.品目CD GROUP BY A.品目CD, B.品目名 CASE2:受注データをグループ化した結果と品目マスタを結合 SELECT X.品目CD, X.受注数合計, Y.品目名 FROM  (SELECT 品目CD, SUM(受注数)   FROM 受注データ   GROUP BY 品目CD)X,品目マスタ Y WHERE X.品目CD = Y.品目CD CASE3:品目マスタの品目CDと品目名のグループ化 SELECT B.品目CD, B.品目名, SUM(A.受注数) FROM 受注データ A, 品目マスタ B WHERE A.品目CD = B.品目CD GROUP BY B.品目CD, B.品目名 レスポンスも含めて教えてください。 よろしく、お願いします。