- ベストアンサー
SQL文で売上テーブルの指定期間のデータを表示する方法
- MySQLを使っている場合、指定期間のデータを表示するためには、WHERE句を使用して日付の範囲を指定し、GROUP BY句を使用して月ごとにデータをまとめる必要があります。
- 具体的なSQL文としては、SELECT文でSUM関数を使用して金額の合計を求め、売上テーブルから指定期間のデータを抽出し、日付を月ごとにフォーマットするためにDATE_FORMAT関数を使用します。
- ただし、月初から月末までのデータを表示させる方法は比較的簡単ですが、指定期間を1か月単位で切り替えて表示させる方法は少し複雑です。具体的な方法はわかりませんが、一般的にはプログラミング言語やフレームワークを活用して、指定期間を取得し、それを基にSQL文を生成する方法があります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
一旦サブクエリで月集計した結果をグループ化して使えば可能です。 月集計では日の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; ※サブクエリ部分だけ結果を見ればどの日付がどの月に集計されたかがわかりやすいです。
その他の回答 (2)
- yamada_g
- ベストアンサー率68% (258/374)
「実際の日付の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');
お礼
回答ありがとうございます。 とても参考になりました。
- mpro-gram
- ベストアンサー率74% (170/228)
各分割の期間が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
お礼
回答ありがとうございます。 とても参考になりました。
お礼
回答ありがとうございます。 とても参考になりました。