dポイントプレゼントキャンペーン実施中!

SQLで、あるグループの集計を行う方法

以下のようなテーブルがあったときに、りんごもしくはぶどうを買ったとき日だけの
合計金額を出したいのですが、どのようにすればよろしいのでしょうか。

テーブルイメージ
--------------------------
購入日 購入者 購入品 金額
20160101 a りんご 100
20160101 a みかん 10
20160102 a りんご 100
20160102 a りんご 100
20160103 a みかん 10
20160103 a みかん 10
20160101 b ぶどう 50
20160101 b みかん 10
20160102 b ぶどう 50
20160102 b ぶどう 50
20160103 b みかん 10
20160103 b みかん 10
--------------------------

アウトプットイメージ
--------------------------
購入日 購入者 合計金額
20160101 a 110
20160102 a 200
20160101 b 60
20160102 b 100
--------------------------

■お願いしたいこと
①例では「購入品」の種類は全3品、合計する条件の「購入品」は2品ですが、
「購入品」の種類が無数あり、合計する条件の「購入品」も複数であった場合でも対応できるような方法で教えていただきたいです。
②データベースはPostgreSQLを使用していますが、汎用的なSQLでお願いしたい。
③基本的に1発のSQLで表形式で帰ってくるSQLの書き方でお願いしたい。
Excelや複数回SQLを行う方法は、出来るだけなしにしてもらいたい。

よろしくお願いいたします。

A 回答 (1件)

汎用性はやってみないとわかりませんが、サブクエリを利用すればこんな感じでしょうか



//元データ
create table tbl(d date,person varchar(20),fruit varchar(20),amount int);
insert into tbl values
('2016-01-01','a','りんご',100),
('2016-01-01','a','みかん',10),
('2016-01-02','a','りんご',100),
('2016-01-02','a','りんご',100),
('2016-01-03','a','みかん',10),
('2016-01-03','a','みかん',10),
('2016-01-01','b','ぶどう',50),
('2016-01-01','b','みかん',10),
('2016-01-02','b','ぶどう',50),
('2016-01-02','b','ぶどう',50),
('2016-01-03','b','みかん',10),
('2016-01-03','b','みかん',10);

//集計
select t1.d,t1.person,sum(amount) as amount
from tbl as t1
inner join
(select distinct d,person from tbl
where fruit in ('りんご','ぶどう')
) as t2
on t1.d=t2.d and t1.person=t2.person
group by d,person
order by person,d;
    • good
    • 0
この回答へのお礼

助かりました

早速ありがとうございます!無事できました。
りんごとぶどうを買った日だけ残して、合計すればよかったんですね。勉強になりました!ありがとうございます。

お礼日時:2016/12/06 13:40

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