我有这个名为Sales的表:
ID Date DepartmentID Amount 1 10-12-2009 12 10 2 18-01-2010 3 23 3 08-02-2010 4 7 ...
现在我需要从每个月和部门的金额列中检索YTD值。
首先我尝试了这个查询:
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 Server错误
为了绕过这个错误,我写了以下查询:
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秒)返回YTD金额的查询吗?
谢谢,
鲍勃
答案 0 :(得分: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(mm,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计算列,请创建索引视图。