Oracle SQL - 如何显示NULL ROWS

时间:2017-11-08 15:53:58

标签: sql oracle

我正在尝试计算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

2 个答案:

答案 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