Table Structure 在這篇文章中添加表是非常困難的,至少我不知道。嘗試使用HTML表格標籤,但他們不會顯得很好。因此將表結構張貼爲圖像。查詢優化以產生計算結果
考慮到圖像中顯示的3個表格,項目,BC,實際支出,作爲示例,我正在尋找一個返回報表作爲結果的最佳查詢。正如你所看到的,BC有一定的計算,與實際支出有
SELECT ProjectId, Name, Budget
, (SELECT b.[BC] FROM [BC] b
WHERE b.[BC] IN
(SELECT SUM(mx.[BC]) FROM [BC] mx
WHERE ProjectId=p.ProjectId)) AS 'BC'
, (SELECT sp.[ActualSpendAmount] FROM [ActualSpend] sp
WHERE sp.[DateSpent] IN
(SELECT MAX(as.[DateSpent]) FROM [ActualSpend] as
WHERE ProjectId=p.ProjectId)) AS 'Actual Spend'
, t.[Budget] - ((SELECT b.[BC] FROM [BC] b
WHERE b.[BC] IN
(SELECT SUM(mx.[BC]) FROM [BC] mx
WHERE ProjectId=p.ProjectId))
+
(SELECT sp.[ActualSpendAmount] FROM [ActualSpend] sp
WHERE sp.[DateSpent] IN
(SELECT MAX(as.[DateSpent]) FROM [ActualSpend] as
WHERE ProjectId=p.ProjectId)))
FROM Projects p;
正如你所看到的,對於選擇BC,與實際支出運行兩次。我還有其他幾個表,如BC,Actual Spend,可以產生一些計算結果。有沒有什麼辦法來優化這個。即使我把它們放在一個函數中,它也是一樣的,函數需要被調用多次。 有沒有辦法來優化這個查詢。
粘貼在下表結構:
項目表:
ProjectId Name Budget
1 DeadRock 500000
2 HardRock 300000
BC表:實際支出表:
ProjectId BCId BC ApprovalDate ProjectId ActualSpendId ActualSpendAmount DateSpent
1 1 5000 2015/02/01 1 1 " 15000" " 2015/03/01"
1 2 3000 2015/03/10 1 2 " 33000" " 2015/05/12"
1 3 15000 2015/05/01 1 3 " 45000" " 2015/06/03"
1 4 5000 2015/07/01 1 4 " 75000" " 2015/07/11"
2 5 2000 2015/03/19 2 5 " 5000" " 2015/04/20"
2 6 6000 2015/05/20 2 6 " 19000" " 2015/05/29"
2 7 25000 2015/08/01 2 7 " 42000" " 2015/06/23"
2 8 " 85000" " 2015/07/15"
報告:
ProjectId Name Budget BC Actual Spend ETC
"1 " DeadRock 500,000 28,000 75,000 397,000 Budget-(BC+ActualSpend)
"2 " HardRock 300,000 " 33,000" 85,000 182,000 Budget-(BC+ActualSpend)
什麼是您的DBMS?看起來像SQL Server,哪個版本? – dnoeth