2016-11-17 152 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