【发布时间】:2010-02-25 14:50:01
【问题描述】:
我有一张名为 Sales 的表:
ID 日期 部门ID 金额 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 条记录。这当然太慢了。谁能帮助我在可接受的时间内(
谢谢,
鲍勃
【问题讨论】:
-
您是否查看过您的索引,看看是否有可以利用或创建的索引?
-
您是在寻找年初至今 (YTD) 还是过去 12 个月?
-
过去 12 个月。我需要记录每年每个月过去 12 个月的总和。因此,例如 2010 年 1 月的一行,总金额从 2009 年 2 月到 2010 年 1 月。
标签: sql sql-server