27

特定の範囲で一連の日付を生成するためのmysqlでの最良の方法は何ですか?

私が念頭に置いているアプリケーションは、レポートするデータがあるかどうかに関係なく、すべての日付の行を返すレポート クエリを作成することです。最も単純な形式では:

select dates.date, sum(sales.amount)
from <series of dates between X and Y> dates
left join sales on date(sales.created) = dates.date
group by 1

たくさんの日付を含むテーブルを作成しようとしましたが、それは不十分な回避策のようです。

4

4 に答える 4

21

カレンダーテーブルを用意するのは良い考えだと思います。特にスパースデータ範囲を埋める場合は、多くのレポート機能とクエリ機能を利用できます。

私はこの記事を良い例のように思われるもので見つけました。

于 2012-12-31T18:43:09.430 に答える
8

可変生成日付系列を使用できます。

Set @i:=0;
SELECT DATE(DATE_ADD(X, 
INTERVAL @i:=@i+1 DAY) ) AS datesSeries
FROM yourtable, (SELECT @i:=0) r
where @i < DATEDIFF(now(), date Y) 
;

これがあなたが試したものであるかどうかはわかりません:)しかし。

次に、上記で生成されたクエリをテーブルとして使用しますleft join

set @i:=0;

select
d.dates,
sum(s.amount) as TotalAmount
from(
SELECT DATE(DATE_ADD(X, 
INTERVAL @i:=@i+1 DAY) ) AS dateSeries
FROM Sales, (SELECT @i:=0) r
where @i < DATEDIFF(now(), date Y) 
) dates d 
left join Sales s
on Date(s.Created) = Date(d.dateSeries)
group by 1
;
于 2012-12-31T18:40:44.720 に答える
4

一時テーブルを使用して日付系列を生成することもできます。以下のクエリを確認してください。

CREATE TEMPORARY TABLE daterange (dte DATE); 

SET @counter := -1;
WHILE (@counter < DATEDIFF(DATE(_todate), DATE(_fromdate))) DO 
    INSERT daterange VALUES (DATE_ADD(_fromdate, INTERVAL @counter:=@counter + 1 DAY));
END WHILE;

SELECT dates.dte, SUM(sales.amount)
FROM daterange dates
LEFT JOIN sales ON DATE(sales.created) = dates.date
GROUP BY dates.dte;
于 2013-01-01T12:38:42.220 に答える