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

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

  • 質問No.8157832
  • 閲覧数579
  • ありがとう数0
  • 気になる数0
  • 回答数2
  • コメント数0

お礼率 26% (23/87)

下記のような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    
  ----------------------------------------------------

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

  • 回答No.2
  • ベストアンサー

ベストアンサー率 35% (316/895)

## 私は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 を一つにまとめて集計したいということ?
(違うと思うけど)なら、そのままでないとだめです。

その他の回答 (全1件)

  • 回答No.1

ベストアンサー率 51% (3827/7415)

別名をつければそれほど難しい話ではないかと

select 商品コード
,sum(販売個数) as 販売個数
,販売店コード
,(select sum(販売個数) from 販売テーブル where 販売店コード=t1.販売店コード) as 商品コード毎販売個数合計
from 販売テーブル as t1
group by 商品コード,販売店コード
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ