使用count()时包括0 SQL Server Left Join无法正常工作

时间:2013-08-08 15:56:09

标签: sql sql-server join

这里我在人员表上使用了左连接,因为我想在该表中包含每条记录,即使它在任务表中没有关联的记录。如何解决此问题以在结果中包含0?

SELECT CONVERT(NVARCHAR, COUNT(p.personID))                                                  AS count,
       CONVERT(DECIMAL(4, 2), 1.0 * COUNT(p.personID) / DATEDIFF(DAY, @startDate, @endDate)) AS average,
       p.personID,
       p.firstname,
       p.lastname,
       c.companyname
FROM   Tasks t
       LEFT JOIN Person p
         ON p.personID = t.personID
       JOIN Client c
         ON c.id = p.employer
       JOIN Commission m
         ON m.ClientID = c.ID
WHERE  t.created BETWEEN @startDate AND @endDate
       AND m.owner IN ( 'John Doe' )
GROUP  BY p.personID,
          p.firstname,
          p.lastname,
          c.companyname
ORDER  BY c.companyname,
          count DESC 

2 个答案:

答案 0 :(得分:2)

我只是想出了我的问题的答案...因为我代表我加入的其他表中的where子句中的条件,它过滤掉了我想要的。所以我将person表更改为“驱动表”,并从where子句中取出条件,并将它们放入join语句中,因为我加入了tasks表,如下所示:

SELECT 
       convert(nvarchar, COUNT(t.personID)) AS count,
       CONVERT(decimal(4, 2), 1.0*COUNT(t.personID) 
                              / DATEDIFF(DAY, @startDate, @endDate)
              ) AS average,
       p.personID,
       p.firstname,
       p.lastname,
       c.companyname
    FROM Person p
    LEFT JOIN Tasks t
       ON t.personID = p.personID AND t.created BETWEEN @startDate AND @endDate  
    JOIN Client c 
       ON c.id = p.employer
    JOIN Commission m 
       ON m.ClientID = c.ID AND m.owner IN ('John Doe')     
    GROUP BY p.personID, p.firstname, p.lastname, c.companyname
    ORDER BY c.companyname, count DESC

答案 1 :(得分:0)

通过子查询而不是WHERE子句提供过滤输入:

SELECT 
   convert(nvarchar, COUNT(p.personID)) AS count,
   CONVERT(decimal(4, 2),1.0*COUNT(p.personID) / DATEDIFF(DAY, @startDate, @endDate)) AS average,
   p.personID,
   p.firstname,
   p.lastname,
   c.companyname
FROM Person p
LEFT JOIN (
    select personId from tasks
    where t.created BETWEEN @startDate AND @endDate
) t
   ON t.personID = p.personID   
JOIN Client c 
   ON c.id = p.employer
JOIN Commission m 
   ON m.ClientID = c.ID AND m.owner IN ('John Doe')     
GROUP BY p.personID, p.firstname, p.lastname, c.companyname
ORDER BY c.companyname, count DESC

在这个特定的例子中可能不是最有用的,但是如果WHERE子句很复杂并且过滤了多个表,那就是答案。