2010-02-25 4 views
4

У меня есть эта таблица называется продажи:года до настоящего времени в месяц

 
ID Date  DepartmentID Amount 
1 10-12-2009   12  10 
2 18-01-2010   3  23 
3 08-02-2010   4  7 
... 

Теперь мне нужно получить значения из с началом года столбца Суммы для каждого месяца и отдела.

Сначала я попробовал этот запрос:

SELECT MonthSales.[Month], MonthSales.DepartmentID, 

    (SELECT SUM(SalesAmount.Amount) FROM Sales AS SalesAmount 
     WHERE (SalesAmount.[Date] >= DATEADD(Month, -12, MonthSales.[Month]) 
      AND SalesAmount.[Date] < DATEADD(Month, 1, MonthSales.[Month])) 
     AND SalesAmount.DepartmentID = MonthSales.DepartmentID) AS Amount 

FROM (SELECT dateadd(month, datediff(month, 0, [Date]),0) AS [Month], DepartmentID 
    FROM Sales) AS MonthSales 
GROUP BY MonthSales.[Month], MonthSales.DepartmentID 

Но это возвращается Внутренняя SQL ошибка сервера

Чтобы обойти эту ошибку, я написал следующий запрос:

SELECT CompareSales.StartDate, CompareSales.EndDate, CompareSales.DepartmentID, 

    (SELECT SUM(SalesAmount.Amount) FROM Sales AS SalesAmount 
     WHERE (SalesAmount.[Date] >= CompareSales.StartDate AND SalesAmount.[Date] < 
      DATEADD(Month, 1, CompareSales.EndDate)) 
     AND SalesAmount.DepartmentID = CompareSales.DepartmentID) AS Amount 

FROM (SELECT DATEADD(Month, -12, PeriodSales.EndDate) AS StartDate,  
    PeriodSales.EndDate, PeriodSales.DepartmentID 
    FROM (SELECT DISTINCT bms.DATESERIAL(DATEPART(Year, EndSales.[Date]), DATEPART 
     (Month, EndSales.[Date]), 1) AS EndDate, EndSales.DepartmentID 
     FROM Sales AS EndSales) AS PeriodSales) AS CompareSales 

GROUP BY CompareSales.StartDate, CompareSales.EndDate, CompareSales.DepartmentID 
ORDER BY CompareSales.StartDate 

Этот запрос возвращал исправить год к настоящему времени суммы за каждый месяц, но требуется 6 минут для обработки всех 4800 записей. Это слишком медленно, конечно. Может ли кто-нибудь помочь мне в направлении запроса, который вернет суммы с начала года в течение приемлемого времени (< 30 секунд)?

Спасибо,

Боб

+0

Были ли у вас взгляды на ваши индексы, чтобы увидеть, есть ли какие-либо возможности, которые вы могли бы использовать или создавать? –

+0

Вы ищете год с даты (с начала года) или последние 12 месяцев? –

+0

Последние 12 месяцев. И мне нужны записи с суммой последних 12 месяцев за каждый месяц каждого года. Так, например, строка для jan-2010 с общей суммой от feb-2009 до jan-2010. –

ответ

2

попробовать это:

DECLARE @YourTable table (RowID int, DateOf datetime, DepartmentID int, Amount int) 

INSERT INTO @YourTable VALUES (1,'12-10-2009',12,10) --changed dd-mm-yyyy to mm-dd-yyyy so it would work on my system 
INSERT INTO @YourTable VALUES (2,'01-18-2010', 3,23) 
INSERT INTO @YourTable VALUES (3,'02-08-2010', 4, 7) 

SELECT 
    DATEPART(mm,DateOf) AS MonthOf,DepartmentID,SUM(Amount) AS TotalAmount 
    FROM @YourTable 
    WHERE DateOf>='01-01-2010' AND DateOF<'01-01-2011' 
    GROUP BY DATEPART(mm,DateOf),DepartmentID 

ВЫВОД

MonthOf  DepartmentID TotalAmount 
----------- ------------ ----------- 
1   3   23 
2   4   7 

(2 row(s) affected) 

, если вам все еще нужно больше скорости, сделать PERSISTED вычисляемый столбец: MonthOfDate который DATEPART (мм, DateOf) и добавьте на него индекс:

ALTER TABLE YourTable ADD MonthOfDate AS DATEPART(mm,DateOf) PERSISTED 

CREATE NONCLUSTERED INDEX IX_YourTable_MonthOfDate 
ON YourTable (MonthOfDate) 

или даже:

CREATE NONCLUSTERED INDEX IX_YourTable_MonthOfDate 
ON YourTable (DateOf,MonthOfDate) 

, если вы не хотите PERSISTED вычисляемый столбец, сделать индексированный вид.

+0

Привет, KM, спасибо за ваш ответ. К сожалению, ваш запрос не возвращает требуемый результат (последние 12 месяцев для каждого месяца в год). Заметил, что я не упоминал об этом в своем посте, так что это плохо. Создание индекса невозможно, потому что я не могу внести никаких изменений в базу данных. –

Смежные вопросы