Следующий запрос возвращает общее количество заказов в неделю за последние 12 месяцев (для конкретного клиента):
SELECT DATEPART(year, orderDate) AS [year],
DATEPART(month, orderDate) AS [month],
DATEPART(wk, orderDate) AS [week],
COUNT(1) AS orderCount
FROM dbo.Orders (NOLOCK)
WHERE customerNumber = @custnum
AND orderDate >= DATEADD(month, -12, GETDATE())
GROUP BY DATEPART(year, orderDate),
DATEPART(wk, orderDate),
DATEPART(month, orderDate)
ORDER BY DATEPART(year, orderDate),
DATEPART(wk, orderDate)
Это возвращает результаты как:
year month week orderCount
2008 1 1 23
2008 3 12 5
...
Как видите, в наборе результатов будут возвращены только недели, в которых есть заказы для этого клиента. Мне нужно, чтобы он возвращал строки для каждой недели за последние 12 месяцев ... если на этой неделе не существует ордера, то возвращение 0 для orderCount было бы хорошо, но мне все еще нужны год, неделя и месяц. Я, вероятно, могу сделать это, создав отдельную таблицу, в которой хранятся недели года, а затем оставил для нее внешнее объединение, но предпочел бы этого не делать. Возможно, в SQL есть что-то, что может сделать это? Могу ли я создать запрос, используя встроенные функции, чтобы вернуть все недели за последние 12 месяцев со встроенными функциями SQL? Я на SQL Server 2008.
Edit:
Используя предложение Скотта, я разместил запрос, решающий эту проблему ниже.