• 締切済み

【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したいのです。 恐れ入りますが、ご教授頂けますよう宜しくお願いします。

  • goot
  • お礼率68% (13/19)
  • Oracle
  • 回答数4
  • ありがとう数2

みんなの回答

回答No.4

つまり、仕様的には 1.AテーブルとマスタのCテーブルを結合した店コードを取得する。 2.取得した店コードでDテーブルの商品コードを取得する。 3.1で取得した店コードと2で取得した商品コードでQテーブルより金額を取得したい。   その際、店コードと商品コードが同じものがあれば合計金額で取得したい。 と言うことでよろしいでしょうか? select Q.店コード,Q.商品コード,sum(Q.金額) as 金額 from (select A.店コード,D.商品コード from A,C,D      where A.店コード=C.店コード and A.店コード=D.店コード      group by A.店コード,D.商品コード) E , Q where E.店コード=Q.店コード and E.商品コード=Q.商品コード group by Q.店コード,Q.商品コード でいいと思います。 問題はA,B,Cの結合ときに複数の商品コードが取得されるので、ここで同じ商品コードは1つしか取得するようにしなければなりません。そうでなければ同じ商品コード複数取得されることになり後の勝利が上手く行きません。 取得した店コードと商品コードでQテーブルより金額を取得し集計を行います。ここでも複数の商品コードが発生することになりますのでgroup byが必要でしょう。動作確認はしておりませんので、悪しからず。

goot
質問者

お礼

ありがとうございます。 上記内容で動作しました。 ご丁寧にありがとうございました。

回答No.3

#1さんと同じ感想を持ったものですが、それではあんまりなのでw ・最初のselect文に登場するC,Dのテーブルは何ですか? ・A,B,C,D,Qのテーブルのカラムを抜粋でいいので教えて下さい。 ・集計するのはどのテーブルに属する金額なのでしょうか? ・店コード、商品コードは全てのテーブルが持っていてKeyになっているのでしょうか? 以上です。

  • joih
  • ベストアンサー率35% (37/105)
回答No.2

(1)Qテーブルから金額合計、A,B テーブルから商品名を取得する (2)Q,A,B は 店コード、商品コード で結合 (3)取得するのは 引数の店コード、商品コードのみ というのであれば、 SELECT W.店コード ,W.商品コード ,X.商品名 ,W.金額 FROM (     SELECT      店コード     ,商品コード     ,Sum(金額) AS 金額     FROM Q     WHERE 店コード = 引数 AND 商品コード = 引数     GROUP BY 店コード, 商品コード ) W     LEFT JOIN (         SELECT 店コード, 商品コード, 商品名         FROM A         WHERE 店コード = 引数 AND 商品コード = 引数         UNION ALL         SELECT 店コード, 商品コード, 商品名         FROM B         WHERE 店コード = 引数 AND 商品コード = 引数         ) X ON ( W.店コード = X.店コード            AND W.商品コード = X.商品コード )

goot
質問者

お礼

ありがとうございます。 大変参考になりました。 今回はunionが使えないのですが、 じっくり読みこみました。 ありがとうございます。 今後に役立てようと思います。

  • joih
  • ベストアンサー率35% (37/105)
回答No.1

仕様を日本語で書いてもらえませんか

goot
質問者

補足

恐れ入ります。日本語にて表現しています。 ---各テーブルkey ・Aテーブル(データ)  店コード ・Cテーブル(マスタ)  店コード ・Dテーブル(マスタ)  店コード  商品コード ・Qテーブル(データ)  店コード  商品コード  メニューコード ---  (処理内容)店コードと商品コードを引数にデータを取得する。 (1)⇒Aデータの情報(棚卸数)と、Aの店コードと紐づいたCの店名   Aの店コードと、商品コードと紐づいたDの商品名を取得。 (2)(ここから追加処理)(1)および、  ⇒Qの店コードとAの店コードが同じ、   Qの商品コードとA商品コードが同じであることを条件に集計し   Qテーブルにある金額をサマリしたい。    ---Qテーブルの内容 店コード:商品コード:メニューコード:金額 123  :456    :01      :100 123  :456    :02      :200 --- 結果、金額に関しては、 引数.店コード:123、引数.商品コード:456の場合、「300」の出力を行いたい。 ◇当初の質問より訂正した個所 SELECT A.棚卸数 C.店名 D.商品名 FORM A,C,D 以上となります。 宜しくお願いします。

関連するQ&A

  • MySQLのgroup by同士の結合について

    下記のようなSQLについてご指南頂きたく思います。 下記のようなテーブルがあり、 商品毎の売上を販売店毎に 売れた順に格納しています。 <販売テーブル> No | 商品コード | 販売個数 | 販売店コード --------------------------------------------- 1  | 商品A   |   1  | 1 2  | 商品A   |   1  | 2 3  | 商品A   |   1  | 3 4  | 商品B   |   2  | 1 5  | 商品B   |   2  | 2 6  | 商品B   |   1  | 3 7  | 商品A   |   3  | 1 8  | 商品A   |   4  | 2 9  | 商品A   |   1  | 3   上記のテーブルを使って下記のようなデータを取ってきたく考えております。   |商品コード|販売個数              |販売店コード |商品コード毎販売個数合計   |       |※ある商品の店毎の販売総数|          |※ある商品の販売総数   --------------------------------------------------------------------------------   | 商品A  |   4               | 1        | 11   | 商品A  |   5               | 2        | 11   | 商品A  |   2               | 3        | 11   | 商品B  |   2               | 1        |  5   | 商品B  |   2               | 2        |  5   | 商品B  |   1               | 3        |  5   -----------------------------------------------------------------------------   やり方としては下記の(1)と(2)の結合ができれば良いと考えております。   一回のSQLで上記の結果を得られるようにしたいと考えております。   どなたかアドバイス頂ければと思います。   宜しくお願い致します。 (1)下記のようなSELECT文で商品コード毎の集計はできました。    SELECT 商品コード,SUM(販売個数) FROM 販売テーブル group by 販売テーブル.商品コード;   | 商品コード  |販売個数             |         |※ある商品の店毎の販売総数   ---------------------------------------   | 商品A     |  11             | 商品B     |   5          (2)また、下記のようなSELECT文で販売店、商品コード毎の集計もできました。    SELECT 商品コード, SUM(販売個数), 販売店コード FROM 販売テーブル                       GROUP BY CONCAT(商品コード,'and',販売店コード) ;   | 商品コード |販売個数              |販売店コード   |        |※ある商品の店毎の販売総数 |        ----------------------------------------------------   | 商品A   |   4                | 1       | 商品A   |   5                | 2       | 商品A   |   2                | 3       | 商品B   |   2                | 1       | 商品B   |   2                | 2       | 商品B   |   1                | 3       ----------------------------------------------------

    • ベストアンサー
    • MySQL
  • 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です。 解決策を教えていただきたく、よろしくお願いします。

  • SQLのGROUP BYについて

    商業高校、情報処理部の2年です。 大会の問題で以下のようなスキーマとSELECT文がありました。 ●業務管理スキーマ(一部抜粋) 従業員(従業員コード,従業員区分,従業員氏名) 勤務(従業員コード,勤務日,開始時刻,勤務時間) 賃金(従業員区分,時間単価) SELECT X.従業員コード , X.従業員氏名 , SUM(Y.勤務時間) * Z.時間単価 AS 総支給額 FROM 従業員 X , 勤務 Y , 賃金 Z WHERE X.従業員コード = Y.従業員コード AND X.従業員区分 = Z.従業員区分 AND X.従業員区分 BETWEEN 1 AND 3 GROUP BY 〔   〕 この穴埋めの答えが、「X.従業員コード , X.従業員氏名」となっていました。 SELECTに書く列名は、GROUP BYで指定された列名でなければならないと聞いたのですが、この問題では、SELECTには書かれている「時間単価」がGROUP BYに書かれていません。 なぜなのか、理由がわかりません。 あるいは、この解答が間違っているのでしょうか? 詳しい方、よろしくお願いします。

  • SQLで部分的にGROUP BYしたいとき(その2

    こんばんわ。 先日こちら(http://okwave.jp/qa/q7666702.html) で質問させていただきましたが、まだ問題があったため、 再度質問させていただきます。 以下のような20カラムある「出納帳」テーブルがあって、 同一日付の金額を集約してしまいたいです。 出納帳 ID 日付   金額 伝票 ・・・(全20カラム) 1 2012/8/20 1000 A01 ・・・ 2 2012/8/20 2000 A02 ・・・ 3 2012/8/21 -1000 B01 ・・・ 4 2012/8/21 -2000 B02 ・・・ 5 2012/8/22 3000 A03 ・・・ 6 2012/8/23 4000 A04 ・・・ 7 2012/8/24 -3000 B03 ・・・ 8 2012/8/24 -4000 B04 ・・・ 9 2012/8/27 5000 A05 ・・・ ↓「日付」で金額集約 ID 日付   金額 伝票 ・・・(全20カラム) 1 2012/8/20 1000 A01 ・・・ 2 2012/8/20 2000 A02 ・・・  2012/8/21 -3000    ・・・(-1000と-2000を集約) 5 2012/8/22 3000 A03 ・・・ 6 2012/8/23 4000 A04 ・・・  2012/8/24 -7000    ・・・(-3000と-4000を集約) 9 2012/8/27 5000 A05 ・・・ と集約キー以外はNULLにしたいのですが、 またまた、 ( SELECT ID, 日付, 金額, 伝票, ・・・ FROM  出納帳 WHERE  金額>=0 UNION ALL SELECT NULL, 日付, SUM(金額), NULL, ・・・ FROM  出納帳 WHERE  金額<0 GROUP BY 日付 ) ORDER BY 日付 とUNIONをする方法しか思いつかなかったのですが、 UNIONせずに端的に表現できるSQLはありますでしょうか?

  • 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 です。 ご存知の方、教えて下さい。

  • 重複するレコードを調べるSQL

    重複するレコードを調べるSQL 初歩的な質問ですみません! 重複するレコードを調べるために以下のようなSQLを作ったのですが、 遅くて困っています。 もっと速くする方法があれば教えてください! 異なるカテゴリーでも商品コードが重複しているものがないかを探すSQLです。 SELECT A.商品コード, A.X, B.カテゴリー FROM (SELECT COUNT(商品コード) X, 商品コード FROM テーブルA WHERE 追加年月 = 201008 GROUP BY 商品コード) A, (SELECT 商品コード, カテゴリー FROM テーブルA WHERE 追加年月 = 201008 ) B " WHERE A.X >= 2 AND B.商品コード = A.商品コード

  • SQL文(基礎内容)

    アドバイスお願いします。 Oracle-Ver-8。 基本中の基本の中身になると思いますが、教えてください。こういったことができるのかお願いします。 SQL文の内容ですが、 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ************************************************** SELECT A.商品コード, A.商品名, SUM(DECODE(B.月,1,1月売上,0)) AS 1月, SUM(DECODE(B.月,2,2月売上,0)) AS 2月, SUM(DECODE(B.月,3,3月売上,0)) AS 3月, : : FROM (状態が'ABC'のもの) A GROUP BY A.商品コード,A.商品名 ************************************************* ↑↑↑ このSQLに異なった状態のもの、'DEF'からも項目を追加したい場合、一つのSQLでどのように表現したらよいのでしょうか?可能でしょうか? 例、 ************************************************** SELECT A.商品コード, A.商品名, SUM(DECODE(B.月,13,13,13月売上,0)) AS 13月, SUM(DECODE(A.月,1,1月売上,0)) AS 1月, SUM(DECODE(A.月,2,2月売上,0)) AS 2月, SUM(DECODE(A.月,3,3月売上,0)) AS 3月, : : FROM (状態が'ABC'のもの) A, (状態が'DEF'のもの) B WHERE 結合条件????? GROUP BY A.商品コード,A.商品名 ************************************************* よろしくお願いします。

  • SQLの書き方を教えて!

    select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd のようにSUMで集計を行うSQLを発行する時に,同時にkingak順にsortすることは可能なのでしょうか? select name,SUM(kingak) from where date between 150221 and 150320 group by frjpc.trcd order by SUM(kingak) としたいところですが,これではエラーになりますね。 SQLでは解決できないんでしょうか?

  • PL/SQL グループ化について

    こんにちは。 現在以下のようなソースが存在するのですが、以下beforeのgroup byに設定している「D」をグループ化の対象外にしなければなりません。 ただし、「D」はSELECT対象であり、かつデータが文字型であり、集計関数の使用対象外(使用した場合に意図した結果とならない)などといった事情があり、単純にgroup by句から外すという対応ではうまくいきません。 誠に恐縮ですが、お知恵をお貸しいただけませんでしょうか? 【before】 ----------------------------------------------------- INSERT INTO 出力テーブル ( A , B , C , D ) SELECT  MIN(テ1.A) AS 別名A,     MAX(テ1.B) AS 別名B,     MAX(テ1.C) AS 別名C,     テ1.D FROM   テーブル1 テ1 WHERE  EXISTS      ( SELECT 0      FROM テーブル2 テ2    JOIN        テーブル3 テ3    ON  テ2.A = テ3.A      WHERE テ1.C = テ2.C      HAVING SUM(DECODE(テ3.G,'Yes',0,1)+DECODE(テ3.H,'Yes',0,1)) = 0 ) GROUP BY テ1.A,     テ1.B,    テ1.C,    テ1.D ;    ←ここを外したいです -----------------------------------------------------

  • SQLについて

    以下のSQLを実行すると。 SQL実行中に以下のエラーが発生しました。 エラーコード:907 [Oracle][ODBC][Ora]ORA-00907: 右カッコがありません。 というエラーが表示されます。 どこがおかしいでしょうか? SELECT Q1.Pコード, Q1.Qコード, T1.E名称 A名称, T2.E名称 B名称, T3.E名称 C名称, T4.E名称 D名称, FROM ( ( ( ( SELECT Pコード, Qコード, Aコード, Bコード, Cコード, Dコード, FROM 報告書 WHERE Pコード = '0001' AND Qコード = '0001' AND ) Q1 INNER JOIN Eマスタ T1 ON Q1.Aコード = T1.Eコード ) INNER JOIN Eマスタ T2 ON Q1.Bコード = T2.Eコード ) INNER JOIN Eマスタ T3 ON Q1.Cコード = T3.Eコード ) INNER JOIN Eマスタ T4 ON Q1.Dコード = T4.Eコード ORDER BY Pコード, Qコード;