質問: 下記のような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 ----------------------------------------------------
回答: ## 私はANo1の方の回答のようにスカラー副問い合わせ使ったほうがいい ##(適切なインデックスをつけると確実に処理が早いため)と思っていますけど ## 質問文の以下を素直に反映したSQL文を参考までに記載しておきます。 >やり方としては下記の(1)と(2)の結合ができれば良いと考えております。 select A.商品コード,A.販売個数,A.販売店コード,B.商品コード毎販売個数合計 from ( SELECT 商品コード, SUM(販売個数) as 販売個数, 販売店コード FROM 販売テーブル GROUP BY CONCAT(商品コード,'and',販売店コード) ) as A, ( SELECT 商品コード,SUM(販売個数) as 商品コード毎販売個数合計 FROM 販売テーブル group by 販売テーブル.商品コード ) as B where A.商品コード = B.商品コード なお、 GROUP BY CONCAT(商品コード,'and',販売店コード) は GROUP BY 商品コード,販売店コード で問題ない というより、商品コード,販売店コードのインデックス作っても早くならないので 後者のほうがいいのでは? (ファンクションインデックス作るのならいいですが、ファンクションインデックスばかり作ると、 システム全体としてインデックスの数が増える傾向になり効率悪い。) あ、ひょっとして、 販売店コード A1 と販売店コード andA1 を一つにまとめて集計したいということ? (違うと思うけど)なら、そのままでないとだめです。