アプリ版:「スタンプのみでお礼する」機能のリリースについて

MYSQLを使っています。


【売上テーブル】

|| 日付 || 金額 ||
-----------------
|| 2011/01/01 || 100 ||
|| 2011/01/01 || 200 ||
|| 2011/01/02 || 600 ||
          ・
          ・
          ・
|| 2012/12/31 || 500 ||
|| 2012/12/31 || 100 ||


SELECT SUM(金額)
FROM 売上テーブル
WHERE 日付 BETWEEN '2011-01-01' AND '2011-12-31'
GROUP BY DATE_FORMAT(日付, '%Y/%m')

で月初から月末のデータを表示させることはできますが、


2011/01/10~2011/02/09を一か月として

以降は
2011/02/10~2011/03/09
2011/03/10~2011/04/09
       ・
       ・
       ・
2011/12/10~2012/01/09

といった感じに1年間のデータを表示させる方法がわかりません。

どうぞ宜しくお願いします。

A 回答 (3件)

各分割の期間がformat関数などで簡単には指定できない場合は、master table として、各期間の開始と終了を保持しておくと便利です。


create table `period_master` (
start_date date
,end_date date
,name varchar(20)
, check (start_date < end_date)
,primary key (start_date , end_date)
);
insert into `period_master` values ('2011-01-10', '2011-02-09' , '2011年1月')
,('2011-02-10', '2011-03-09' , '2011年2月')
,,, /* 中略 3月から10月まで同様に */
,('2011-11-10', '2011-12-09' , '2011年11月')
,('2011-12-10', '2012-01-09' , '2011年12月') ;

select master.name , sum(sales.`金額`)
from `売上テーブル` as sales inner join `period_master` as master
on sales.`日付` between master.start_date and master.end_date
group by master.name
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
とても参考になりました。

お礼日時:2013/11/12 13:30

一旦サブクエリで月集計した結果をグループ化して使えば可能です。


月集計では日の9以下は-1ヶ月としています。


SELECT x.tmp,SUM(x.金額)
 FROM
  (SELECT
   日付,
   CASE WHEN DATE_FORMAT(日付,'%e') < 10 THEN DATE_FORMAT(日付 - interval 1 month, '%Y/%m') ELSE DATE_FORMAT(日付, '%Y/%m') END tmp,
   金額
   FROM mysql.uriage) x
WHERE x.日付 BETWEEN '2011-01-10' AND '2011-12-31'
GROUP BY x.tmp;


※サブクエリ部分だけ結果を見ればどの日付がどの月に集計されたかがわかりやすいです。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
とても参考になりました。

お礼日時:2013/11/12 13:31

「実際の日付の9日前」でグルーピングすれば済む気もします。



SELECT SUM(金額)
FROM 売上テーブル
WHERE 日付 BETWEEN '2011-01-01' AND '2011-12-31' --正しくは '2011-01-10' AND '2012-01-09' ?
GROUP BY DATE_FORMAT(日付 - INTERVAL 9 DAY, '%Y/%m');
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
とても参考になりました。

お礼日時:2013/11/12 13:30

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