【问题标题】:SQL Query Count results as zero event record is not existSQL 查询计数结果为零事件记录不存在
【发布时间】:2020-11-24 21:15:00
【问题描述】:

我对 SQL 查询(Oracle 数据库)有疑问。

我有两张桌子。一张是“ACCIDENTS”,另一张是“REASONS”。第二个是表有一些预定义的默认值。

 - REASONS -

Reason 1
Reason 2
Reason 3
Reason 4

现在在 ACCIDENTS 表中,我们插入上一个表中的一些事故和原因,如下所示

 - ACCIDENTS -

Accident 1  - Reason 1
Accident 2  - Reason 1
Accident 3  - Reason 4

即使在 ACCIDENTS 表中不存在一个原因,我也想获得所有 4 个原因的 GROUP BY 事故计数。在这种情况下,我希望 Count = 0 如下所示:

REASONS   COUNT (of Accidents)
Reason 1    2
Reason 2    0
Reason 3    0
Reason 4    1

不成功我已经尝试了不同类型的 JOIN 表,但我没有得到原因 2 和原因 3 的结果,因为它们在 ACCIDENTS 表中不存在。每次结果都是:

REASONS   COUNT (of Accidents)
Reason 1    2
Reason 4    1

任何解决方案/想法?

提前致谢!


更新!

这是查询:

SELECT R.REASON_NAME AS REASON, COUNT(A.ID) AS COUNT_OF_ACCIDENTS
FROM ACCIDENTS A
RIGHT JOIN REASONS R ON R.ID = A.REASON_ID
WHERE EXTRACT(YEAR FPOM A.DATE_OF_ACCIDENT) = 2017
GROUP BY R.REASON_NAME

如果我删除 WHERE 语句,那么我会正确获取所有原因,但事故表中的 Where for Year 是强制性的。

【问题讨论】:

  • 看起来您只是想要一个外部联接,但请编辑您的问题以显示当前查询。包含一个您尝试过的不同类型的连接可能会有所帮助,这样我们就可以看到您哪里出错了。
  • 用我的查询更新了我的问题

标签: sql oracle join count


【解决方案1】:

你想要一个left join 和聚合:

select r.reason, count(a.reason)
from reasons r left join
     accidents a
     on r.reason = a.reason and
        a.date_of_accident >= date '2017-01-01' and
        a.date_of_accident < date '2018-01-01'
group by r.reason;

【讨论】:

  • 感谢您的回复。那是正确的!但我更新了我的问题。我的查询中还有一个 where 会导致问题。你能再检查一下吗?
  • @ktsigkounis 。 . .您需要将该条件移至 ON 子句。
  • 这就是解决方案! :) 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 2017-12-11
  • 2023-01-11
  • 1970-01-01
  • 2013-03-08
相关资源
最近更新 更多