之前我问过这个问题:
How do I bring back an entire range of dates in SQL between two dates, even when there is no data?
但我现在只需要选择状态为“E”的紧急事件。
我不能把WHERE status ='E',因为这会阻止它为每个日期返回一个条目。
我该如何解决这个问题?
答案 0 :(得分:5)
只需将其添加到LEFT OUTER JOIN ... ON
,因为就我理解的问题而言,这是连接行的条件。
这样的事情:
WITH DateRange(date) AS (
SELECT @dateFrom dt
UNION ALL
SELECT DATEADD(dd, 1, date) date FROM DateRange WHERE date < @dateTo
)
SELECT DateRange.date, count(incident.id)
FROM DateRange
LEFT OUTER JOIN incident
ON incident.date >= DateRange.date
AND incident.date < DATEADD(dd, 1, DateRange.date)
AND incident.status = 'E'
GROUP BY DateRange.date
ORDER BY DateRange.date
答案 1 :(得分:0)
就像你在问题中所说的那样,将条件放在WHERE子句中会有效地将你的LEFT JOIN转换为INNER JOIN。
您应该将此添加到LEFT JOIN条件中,因为它意味着它是连接的条件。
类似于table1
LEFT JOIN table2 ON table1.field = table2.field AND table1.status='E'