我正在尝试计算16000到16005天之间的延迟次数。问题是我只能在有延误的日子里获得行数。如果查询检测到零延迟的一天,我就不会显示那一天。我希望所有日子都出现,即使有任何延迟也没有。我想我会使用LEFT OUTER JOIN来解决这个问题,其中包含一个表格,其中包含16000到16005之间的所有日期,与延迟的数量无关,但它并没有什么区别。
我怎样才能做到这一点?这似乎相当简单,但我无法理解这一点。提前谢谢。
SELECT A.dep_date, COUNT(A.leg) AS x
FROM delay A
LEFT OUTER JOIN
(SELECT utilization.date
FROM utilization
GROUP BY utilization.date
HAVING utilization.date BETWEEN 16000 AND 16005) B
ON B.date = A.dep_date
GROUP BY A.dep_date
HAVING A.dep_date BETWEEN 16000 AND 16005
ORDER BY A.dep_date
答案 0 :(得分:0)
你仍然只看到延迟的日子,因为你只返回包含在A' A'中的行。在你的HAVING。
尝试这样的事情
SELECT
u.date,
a.cnt AS x
FROM
utilization u
LEFT JOIN
(SELECT
dep_date,
count(leg) as cnt
from
delay
group by
dep_date) a
ON u.date = A.dep_date
WHERE u.date BETWEEN 16000 AND 16005
ORDER BY u.date
(未经测试)
通过在子查询中添加日期范围,您可能会发现更好的性能。取决于你有多少数据,如果它值得或不值得。
答案 1 :(得分:0)
谢谢马修。我尝试过你的代码但是没有用。无论如何,你已经向我展示了我做错了什么,这让我想到了使用UNION和SUM。我终于得到了我想要的结果。
SELECT date, SUM(x) as y
FROM
(
SELECT B.date, 0 AS x
FROM utilization B
WHERE B.date BETWEEN 16000 AND 16005
GROUP BY B.date
UNION
SELECT A.dep_date, COUNT(A.leg) AS x
FROM delay A
WHERE A.dep_date BETWEEN 16000 AND 16005
GROUP BY A.dep_date
)
GROUP BY date
ORDER BY date