В следующем запросе предполагается, что в таблице SalesTable есть поле с именем Amount (значение, которое вы хотите суммировать) и поле с именем SaleDate (дата, когда произошла продажа). Также предполагается, что учетные месяцы начинаются в первый понедельник. месяца и заканчивается в воскресенье до начала следующего отчетного месяца.
Опять же, я настоятельно рекомендую к этому подход на основе таблиц, но если вы не можете изменить схему, это должно сработать в T-SQL:
SELECT
CASE WHEN s.SaleDate < DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0)
THEN DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, DATEADD(day,-7,s.SaleDate) ),DATEADD(day,-7,s.SaleDate) )), 0)
ELSE DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0)
END AccountingMonth,
SUM(s.Amount) TotalSales
FROM SalesTable s
GROUP BY
CASE WHEN s.SaleDate < DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0)
THEN DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, DATEADD(day,-7,s.SaleDate) ),DATEADD(day,-7,s.SaleDate) )), 0)
ELSE DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0)
END
Обратите внимание, что поле возврата AccountingMonth фактически содержит дату первого понедельника месяца. На практике вы, вероятно, захотите обернуть весь этот запрос в другой запрос, который переформатирует AccountingMonth во что угодно: «2011-07», «2011-08» и т. Д.
Вот как это работает: этот фрагмент кода является важной частью:
DATEADD(WEEK, DATEDIFF(WEEK, 0, DATEADD(DAY, 6 - DATEPART(DAY, s.SaleDate ),s.SaleDate )), 0)
Он принимает любую дату и возвращает первый понедельник месяца, в котором эта дата произошла. В вашем случае, однако, вам придется проделать немного больше работы, потому что продажа могла произойти в окне между первым месяцем месяца и первым понедельником месяца. Оператор CASE обнаруживает этот сценарий и, если он верен, вычитает неделю от даты до вычисления первого понедельника.
Удачи!
-Michael