我有一个查询,我想要更改,以便它为我提供当前 52周的计数。此查询使用我制作的日历表,其中包含固定范围内的日期列表。现在的查询是选择最大和最小日期,而不一定是过去52周。
我想知道如何让我的日历表保持最新状态,以便我可以获得最后52周(即从现在到一年前)。或者是否有另一种方法使查询独立于使用日历表?
以下是查询:
SELECT calendar.datefield AS date, IFNULL(SUM(purchaseyesno),0) AS item_sales
FROM items_purchased join items on items_purchased.item_id=items.item_id
RIGHT JOIN calendar ON (DATE(items_purchased.purchase_date) = calendar.datefield)
WHERE (calendar.datefield BETWEEN (SELECT MIN(DATE(purchase_date))
FROM items_purchased) AND (SELECT MAX(DATE(purchase_date)) FROM items_purchased))
GROUP BY week(date)
想法?
答案 0 :(得分:1)
有些人不喜欢这种方法,但我倾向于使用包含0 - 1000值的虚拟表,然后使用派生表生成所需的范围 -
CREATE TABLE dummy (`num` INT NOT NULL);
INSERT INTO dummy VALUES (0), (1), (2), (3), (4), (5), .... (999), (1000);
如果你的表有一个自动递增的id和大量的行,你可以从中生成它 -
CREATE TABLE `dummy`
SELECT id AS `num` FROM `some_table` WHERE `id` <= 1000;
请记住插入0值。
SELECT CURRENT_DATE - INTERVAL num DAY
FROM dummy
WHERE num < 365
因此,将此方法应用于您的查询,您可以执行以下操作 -
SELECT WEEK(calendar.datefield) AS `week`, IFNULL(SUM(purchaseyesno),0) AS item_sales
FROM items_purchased join items on items_purchased.item_id=items.item_id
RIGHT JOIN (
SELECT (CURRENT_DATE - INTERVAL num DAY) AS datefield
FROM dummy
WHERE num < 365
) AS calendar ON (DATE(items_purchased.purchase_date) = calendar.datefield)
WHERE calendar.datefield >= (CURRENT_DATE - INTERVAL 1 YEAR)
GROUP BY week(datefield) -- shouldn't this be datefield instead of date?
答案 1 :(得分:1)
我通常使用@sql变量动态“模拟”一个表,然后只需加入系统中任意时间最短至少所需数周的表。注意......在处理日期时,我喜欢通常只使用日期部分,这意味着上午12:00:00。此外,通过将“EndOfWeek”的开始日期提前7天,您现在可以在给定时间段内为记录应用BETWEEN子句...例如您的每周需求。
我已经应用了这样一个样本来协调基于日期关联的联接到每周......自从你
select
DynamicCalendar.StartOfWeek,
COALESCE( SUM( IP.PurchaseYesNo ), 0 ) as Item_Sales
from
( select
@weekNum := @weekNum +1 as WeekNum,
@startDate as StartOfWeek,
@startDate := date_add( @startDate, interval 1 week ) EndOfWeek
from
( select @weekNum := 0,
@startDate := date(date_sub(now(), interval 1 year ))) sqlv,
AnyTableThatHasAtLeast52Records,
limit
52 ) DynamicCalendar
LEFT JOIN items_purchased IP
on IP.Purchase_Date bewteen DynamicCalendar.StartOfWeek
AND DynamicCalendar.EndOfWeek
group by
DynamicCalendar.StartOfWeek
这是在您的“PurchaseYesNo”值直接在您购买的表中的前提下。如果是这样,则无需加入ITEMS表。如果在项目表中的字段是IS,那么我只需要对你的项目表进行LEFT JOIN并从中获取价值。
但是,您可以在很多条件下使用dynamicCalendar上下文。