2016-11-17 153 views
0

我有查詢這需要很長時間才能執行如何刪除鮮明的SQL查詢

SELECT 
    cft.ID, cft.Name AS 'CauseArea' , COUNT(DISTINCT e.ID) AS 'Donors', 
    SUM(CASE WHEN d.DonationType = 1 THEN d.Amount ELSE 0 END) AS 'DonationsForAvarage' , 
    SUM(CASE WHEN d.DonationType = 1 THEN d.Amount ELSE 0 END) AS 'EmployeeDonations' , 
    SUM(CASE WHEN d.DonationType = 2 THEN d.Amount ELSE 0 END) AS 'MatchedDonations' , 
    SUM(CASE WHEN d.DonationType = 1 OR d.DonationType = 2 THEN d.Amount ELSE 0 END) AS 'TotalDonations' 
FROM 
    dbo.Donation d 
INNER JOIN 
    dbo.Employee e ON e.ID = d.Employee 
INNER JOIN 
    CharityProjectDetails cpd ON d.CharityProjectDetails = cpd.ID 
INNER JOIN 
    CharityDetails cd ON cpd.CharityDetails = cd.ID 
INNER JOIN 
    CauseFocusType cft ON cd.CauseFocusType = cft.ID 
GROUP BY 
    cft.ID, cft.Name 

所以我注意到DISTINCT是吃。我想擺脫DISTINCT - 我該怎麼做?

+0

你真的需要'dbo.Employee'在你的查詢嗎?嘗試刪除它並使用COUNT(DISTINCT d.Employee)作爲'Donors''看看它是否有所作爲 – cha

+0

@cha是啊它不需要,但一些捐款沒有員工我想擺脫這些 – Gayan

回答

0

它看起來像dbo.Employee上的INNER JOIN不是必需的,因爲您已經擁有dbo.Donation中的數據。試試這個:

SELECT cft.ID 
,cft.NAME AS 'CauseArea' 
,COUNT(DISTINCT d.Employee) AS 'Donors' 
,SUM(CASE 
     WHEN d.DonationType = 1 
      THEN d.Amount 
     ELSE 0 
     END) AS 'DonationsForAvarage' 
,SUM(CASE 
     WHEN d.DonationType = 1 
      THEN d.Amount 
     ELSE 0 
     END) AS 'EmployeeDonations' 
,SUM(CASE 
     WHEN d.DonationType = 2 
      THEN d.Amount 
     ELSE 0 
     END) AS 'MatchedDonations' 
,SUM(CASE 
     WHEN d.DonationType = 1 
      OR d.DonationType = 2 
      THEN d.Amount 
     ELSE 0 
     END) AS 'TotalDonations' 
FROM dbo.Donation d 
INNER JOIN CharityProjectDetails cpd ON d.CharityProjectDetails = cpd.ID 
INNER JOIN CharityDetails cd ON cpd.CharityDetails = cd.ID 
INNER JOIN CauseFocusType cft ON cd.CauseFocusType = cft.ID 
GROUP BY cft.ID 
,cft.NAME 
+0

是啊我同意員工doesn不需要,但查詢的問題是「DISTINCT」關鍵字,這個查詢也需要很長時間才能執行。 – Gayan

+0

好的,無法通過員工列進行分組,很難避免使用DISTINCT呼叫。在查詢計劃中,是否正確選擇了索引?如果不能輕易避免,最好先查看其他性能問題。 – cyclington

1

我已經使用子查詢捐贈表。請檢查這是否對你有幫助。

 SELECT cft.ID 
,cft.NAME AS 'CauseArea' 
,d.cnt AS 'Donors' 
,SUM(CASE 
     WHEN d.DonationType = 1 
      THEN d.Amount 
     ELSE 0 
     END) AS 'DonationsForAvarage' 
,SUM(CASE 
     WHEN d.DonationType = 1 
      THEN d.Amount 
     ELSE 0 
     END) AS 'EmployeeDonations' 
,SUM(CASE 
     WHEN d.DonationType = 2 
      THEN d.Amount 
     ELSE 0 
     END) AS 'MatchedDonations' 
,SUM(CASE 
     WHEN d.DonationType = 1 
      OR d.DonationType = 2 
      THEN d.Amount 
     ELSE 0 
     END) AS 'TotalDonations' 
FROM (SELECT Employee 
      ,DonationType 
      ,CharityProjectDetails 
      ,Amount 
      ,COUNT(Employee) as cnt 
     FROM dbo.Donation 
     GROUP BY Employee 
      ,DonationType 
      ,CharityProjectDetails 
      ,Amount) d 
INNER JOIN CharityProjectDetails cpd ON d.CharityProjectDetails = cpd.ID 
INNER JOIN CharityDetails cd ON cpd.CharityDetails = cd.ID 
INNER JOIN CauseFocusType cft ON cd.CauseFocusType = cft.ID 
GROUP BY cft.ID 
,cft.NAME