0

在这里,我在 person 表上使用了左连接,因为我想包含该表中的每条记录,即使它在任务表中没有关联记录。如何解决此问题以在结果中包含 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 
4

2 回答 2

2

我刚刚找到了我的问题的答案......因为我代表我加入的其他表在 where 子句中放置了条件,它过滤掉了我想要的内容。因此,我将 person 表更改为“driving table”,并从 where 子句中获取条件并将它们放入 join 语句中,因为我正在加入任务表,如下所示:

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
于 2013-08-08T16:25:12.050 回答
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 子句很复杂并且过滤多个表,这就是答案。

于 2014-08-01T19:15:49.080 回答