Этот код длиннее, чем Стив Морганс, но предназначен для того, чтобы оптимизатор мог использовать любой существующий индекс в полях year
и year_month
. Это актуально, только если у вас относительно большая таблица, так как она предназначена для эффективного определения того, какие записи можно пропустить.
(Предполагается также использование MS SQL Server, но логика применима к другим СУБД.)
DECLARE
@DateParam AS DATETIME
SELECT
@DateParam = '2011 June 01'
;WITH MyTable (Name, Year, Year_Month, Sales) AS
(
SELECT 'Rod', 2010, 1, 10
UNION ALL SELECT 'Rod', 2010, 2, 10
UNION ALL SELECT 'Rod', 2010, 3, 10
UNION ALL SELECT 'Rod', 2010, 4, 10 UNION ALL SELECT 'Jane', 2010, 4, 10
UNION ALL SELECT 'Rod', 2010, 5, 10 UNION ALL SELECT 'Jane', 2010, 5, 10
UNION ALL SELECT 'Rod', 2010, 6, 10 UNION ALL SELECT 'Jane', 2010, 6, 10
------------------------------------------------------------------------------
UNION ALL SELECT 'Rod', 2010, 7, 10 UNION ALL SELECT 'Jane', 2010, 7, 10
UNION ALL SELECT 'Rod', 2010, 8, 10 UNION ALL SELECT 'Jane', 2010, 8, 10
UNION ALL SELECT 'Rod', 2010, 9, 10 UNION ALL SELECT 'Jane', 2010, 9, 10
UNION ALL SELECT 'Rod', 2010,10, 10 UNION ALL SELECT 'Jane', 2010,10, 10
UNION ALL SELECT 'Jane', 2010,11, 10
UNION ALL SELECT 'Jane', 2010,12, 10
UNION ALL SELECT 'Jane', 2011, 1, 10
UNION ALL SELECT 'Jane', 2011, 2, 10
UNION ALL SELECT 'Rod', 2011, 3, 10 UNION ALL SELECT 'Jane', 2011, 3, 10
UNION ALL SELECT 'Rod', 2011, 4, 10 UNION ALL SELECT 'Jane', 2011, 4, 10
UNION ALL SELECT 'Rod', 2011, 5, 10
UNION ALL SELECT 'Rod', 2011, 6, 10
------------------------------------------------------------------------------
UNION ALL SELECT 'Rod', 2011, 7, 10
)
SELECT
Name,
Year,
Year_Month,
SUM(sales) AS Total_Sales
FROM
MyTable
WHERE
(Year = DATEPART(YEAR, @DateParam) AND Year_Month <= DATEPART(MONTH, @DateParam))
OR (Year = DATEPART(YEAR, @DateParam) - 1 AND Year_Month > DATEPART(MONTH, @DateParam))
GROUP BY
Name,
Year,
Year_Month
Примечания:
1. Это даст результаты за 12 месяцев до июня 2011 года включительно
2. Данные до июля 2010 года не будут включены
3. Пробел в данных Рода не приведет к нарушению Note 3
4. Отсутствие данных Джейн в мае 2011 года и июне 2011 года не приведет к нарушению Note 3
5. Формулировка предложения WHERE позволит использовать ИНДЕКСЫ