您的 MonthlyTarget 表中似乎缺少一些列,即“TargetDate”列。
除了每个人已经说过的关于索引的内容之外,有时分而治之的方法确实会有所帮助。与其将 1966177 行表连接到 400310 行表,不如创建小型临时表并将它们连接在一起:
CREATE TABLE #MonthlySalesAgg
(
SalesManCode int,
JanTar money,
FebTar money,
MarTar money,
AprTar money,
MayTar money,
JunTar money,
JulTar money,
AugTar money,
SepTar money,
OctTar money,
NovTar money,
DecTar money
PRIMARY KEY CLUSTERED (SalesManCode)
)
INSERT INTO #MonthlySalesAgg
SELECT *
FROM
(SELECT SalesManCode, TargetValue, SaleMonth = Month(TargetDate) FROM MonthlyTarget) as temp
PIVOT
(
Max(TargetValue)
FOR [SaleMonth] IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])
) as p
CREATE TABLE #MonthlyTargetAgg
(
SalesManCode int,
JanAch money,
FebAch money,
MarAch money,
AprAch money,
MayAch money,
JunAch money,
JulAch money,
AugAch money,
SepAch money,
OctAch money,
NovAch money,
DecAch money
PRIMARY KEY CLUSTERED (SalesManCode)
)
INSERT INTO #MonthlyTargetAgg
SELECT * FROM
(SELECT SalesManCode, AchievedValue, SaleMonth = Month(SaleDate) FROM MonthlySales) as temp
PIVOT
(
Sum(AchievedValue)
FOR [SaleMonth] IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])
) as p
上面的查询创建了两个中间表,它们应该包含与 SalesMan 表相同数量的记录。加入他们很简单:
SELECT *
FROM #MonthlyTargetAgg target
INNER JOIN #MonthlySalesAgg sales ON target.SalesManCode = sales.SalesManCode
如果您发现自己一直需要按月提取数据,请将代码移到视图中。
PIVOT 需要 SQL Server 2005 或更高版本,它通常是一个非常有用的运算符。希望 SQL Server 2008 将允许用户一次以多个列为轴,这将产生比上面显示的更简单的查询。
使用 SQL Server 2000:
PIVOT 是语法糖。例如,
SELECT * FROM
(SELECT SalesManCode, AchievedValue, SaleMonth = Month(SaleDate) FROM MonthlySales) as temp
PIVOT
(
Sum(AchievedValue)
FOR [SaleMonth] IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])
) as p
变成
SELECT
SalesManCode,
[1] = Sum(case SaleMonth when 1 then AchievedValue else 0 end),
[2] = Sum(case SaleMonth when 2 then AchievedValue else 0 end),
[3] = Sum(case SaleMonth when 3 then AchievedValue else 0 end),
[4] = Sum(case SaleMonth when 4 then AchievedValue else 0 end),
[5] = Sum(case SaleMonth when 5 then AchievedValue else 0 end),
[6] = Sum(case SaleMonth when 6 then AchievedValue else 0 end),
[7] = Sum(case SaleMonth when 7 then AchievedValue else 0 end),
[8] = Sum(case SaleMonth when 8 then AchievedValue else 0 end),
[9] = Sum(case SaleMonth when 9 then AchievedValue else 0 end),
[10] = Sum(case SaleMonth when 10 then AchievedValue else 0 end),
[11] = Sum(case SaleMonth when 11 then AchievedValue else 0 end),
[12] = Sum(case SaleMonth when 12 then AchievedValue else 0 end)
FROM
(SELECT SalesManCode, AchievedValue, SaleMonth = Month(SaleDate) FROM MonthlySales) as temp
GROUP BY SalesManCode