プロが教える店舗&オフィスのセキュリティ対策術

店舗の毎日の売り上げを、日付・販売員名・売り上げ額のテーブルで集計しています。

【テーブル例1】
date, name, price
2014-05-01,吉田,2400
2014-05-01,佐藤,1500
2014-05-02,佐藤,3000
...(中略)...
2014-06-18,佐藤,3000
2014-06-30,吉田,1000

これを月別、販売員別の金額で次のように集計したいのですが、

【例2】
各販売員がその月に売り上げた金額の合計
2014-5 吉田 205000
2014-5 佐藤 120000
2014-6 吉田 75000
2014-6 佐藤 90000

SELECT文における"GROUP BY"の条件を、"GROUP BY date AND name"のように"AND"でつなげてもうまくいきませんでした。

もちろん、条件をひとつだけにした"GROUP BY date" および "GROUP BY name"では、それぞれ日付別の集計、あるいは販売員名別の集計が出ます。

【質問】
1.GROUP BYは複数の条件をつけることができないのでしょうか?
2.どのようにすれば【例2】の集計ができますか?

A 回答 (2件)

select year(date) as Y, month(date) as M, name, sum(price)


from SAMPLE_TABLE
group by Y, M, name

って感じ?

この回答への補足

ありがとうございます。commaで区切るんですね。テンポラリーテーブルを作らないといけないと思っていました。

補足日時:2014/06/25 17:21
    • good
    • 0

月ごとに集計するのが決まっているのであれば、できればそれ用のカラムを用意しておくと


集計の効率がたかくなり

//集計用カラムを用意しない場合
create table tbl1 (id int not null primary key auto_increment,salesdate date, name varchar(20), price int,index(salesdate,name,price));
insert into tbl1 (salesdate,name,price) values(
'2014-05-01','吉田',2400),(
'2014-05-01','佐藤',1500),(
'2014-05-02','佐藤',3000),(
'2014-05-03','佐藤',10000),(
'2014-05-04','佐藤',100),(
'2014-06-18','佐藤',3000),(
'2014-06-30','吉田',1000);

//集計
select DATE_FORMAT(salesdate,'%Y%m') as ym,name ,sum(price) as amount from tbl1 group by ym,name;

//集計用カラムを用意する場合
create table tbl2 (id int not null primary key auto_increment,salesdate date,ym varchar(6), name varchar(20), price int,index(ym,name,price));
insert into tbl2 (salesdate,name,price) values (
'2014-05-01','吉田','2400'),(
'2014-05-01','佐藤','1500'),(
'2014-05-02','佐藤','3000'),(
'2014-05-03','佐藤','10000'),(
'2014-05-04','佐藤','100'),(
'2014-06-18','佐藤','3000'),(
'2014-06-30','吉田','1000');
update tbl2 set ym=DATE_FORMAT(salesdate,'%Y%m');

//集計
select ym ,name ,sum(price) as amount from tbl2 group by ym,name;

それぞれの集計SQLをEXPLAINすると効率の違いがわかると思います

この回答への補足

参照の頻度が高い場合、ymのカラムを作っておくということですね。ありがとうございます。

補足日時:2014/06/25 20:02
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す