这里我在人员表上使用了左连接,因为我想在该表中包含每条记录,即使它在任务表中没有关联的记录。如何解决此问题以在结果中包含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
答案 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子句很复杂并且过滤了多个表,那就是答案。