Я тоже обычно "симулирую" таблицу на лету, используя переменные @sql, и просто присоединяюсь к ЛЮБОЙ таблице в вашей системе, у которой есть как минимум столько недель, сколько вы хотите. ПРИМЕЧАНИЕ ... при работе с датами я обычно использую только часть даты, которая подразумевает 12:00:00 утра. Кроме того, увеличив дату начала на «7 дней» для «EndOfWeek», теперь вы можете применить условие 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
Это при условии, что ваше значение «BuyYesNo» находится непосредственно в купленной вами таблице. Если это так, нет необходимости присоединяться к таблице ITEMS. Если в таблице предметов есть поле IS, то я бы просто добавил LEFT JOIN для вашей таблицы товаров и получил бы значение из этого.
Однако вы можете использовать контекст dynamicCalendar в МНОГИХ условиях.