Вам необходимо сначала создать набор результатов, который показывает все возможные «недели» за ожидаемый период времени. Это основано на не совсем точном знании содержания вашей календарной таблицы ... Представляет ли это каждый день? или просто первый день данной недели. Если так, мне придется немного его отрегулировать. Затем получите это с декартовым результатом по типам автомобилей, чтобы каждый автомобиль всегда показывал каждую неделю. Наконец, мы можем ПРИСОЕДИНЯТЬСЯ (чтобы мы не теряли ни недели, ни машины) к данным о продажах. Оставьте присоединиться к этому для клиентов, в зависимости от вашей квалификации в конкретной стране.
СУММА (ЕСЛИ ()) должна гарантировать, что вы ТОЛЬКО учитываете тех, у кого есть продажа автомобиля, а также клиент и клиент, находящийся в стране "НЛ". Любые другие продажи будут игнорироваться.
SELECT
AllWeeksAllCars.WeekNumber,
AllWeeksAllCars.Name,
SUM( IF( Customer.Customer_ID > 0, 1, 0 ) ) as CarSales
FROM
( select AllWeeks.*,
Car.car_id,
Car.Name
from
( select
WEEKOFYEAR( Calendar.DateField ) as WeekNumber,
MIN( Calendar.DateField ) as FirstDate,
MAX( Calendar.DateField ) as LastDate
from
Calendar
where
Calendar.dateField > '2012-01-01'
AND Calendar.dateField < '2012-01-01'
group by
`WeekNumber` ) AllWeeks,
car
order by
AllWeeks.WeekNumber,
Car.Name ) AllWeeksAllCars
LEFT JOIN CarSales
on CarSales.Sell_Time between AllWeeksAllCars.FirstDate and AllWeeksAllCars.LastDate
AND CarSales.Car_ID = AllWeeksAllCars.Car_ID
LEFT JOIN Customer
on CarSales.Customer_ID = Customer.Customer_ID
AND Customer.Country = 'NL'
GROUP BY
AllWeeksAllCars.WeekNumber,
AllWeeksAllCars.Name