如何在Oracle SQL中包含计数为零()的美国州?

如何在Oracle SQL中包含计数为零()的美国州?,sql,oracle,Sql,Oracle,我正在努力为Oracle db创建一个查询,该查询将为每个未在此查询结果中表示的美国州返回0: SELECT TBL_STATES.STATE_ABBR as State, count(tbl_stations.station_state) AS Observations FROM TBL_STATES LEFT JOIN TBL_STATIONS ON TBL_STATES.STATE_ABBR = TBL_STATIONS.STATION_STATE LE

我正在努力为Oracle db创建一个查询,该查询将为每个未在此查询结果中表示的美国州返回0:

SELECT TBL_STATES.STATE_ABBR as State, count(tbl_stations.station_state) AS Observations    
FROM  TBL_STATES 
      LEFT JOIN TBL_STATIONS ON TBL_STATES.STATE_ABBR = TBL_STATIONS.STATION_STATE
      LEFT JOIN TBL_OBSERVATIONS ON TBL_STATIONS.STATION_ID = TBL_OBSERVATIONS.STATION_ID      
WHERE EXTRACT(year FROM TBL_OBSERVATIONS.OBSERVATION_DATE)='2015'
AND   EXTRACT(month FROM TBL_OBSERVATIONS.OBSERVATION_DATE)='8'
GROUP BY STATE_ABBR
ORDER BY STATE_ABBR
查询当前返回已进行观察的每个状态的计数,如下所示:

STATE | OBSERVATIONS
AZ    | 131
CA    | 30
CO    | 9
FL    | 6
……等等

我想看到的是TBL_州每个条目的计数,其中包含所有50个州+DC和PR的记录:

STATE | OBSERVATIONS
AK    | 0
AL    | 0
AR    | 0
AZ    | 131
CA    | 30
CO    | 9
CT    | 0
DC    | 0
DE    | 0
FL    | 6
……等等

我还尝试了NVLcountTBL_STATES.STATE_缩写为0的变体,但没有成功


我到底遗漏了什么?

只需将日期条件移动到ON子句:

因为您似乎想要计算观察值,所以我还将计数固定为来自观察值表。当左联接未找到匹配项时,这一点很重要

我非常喜欢使用表别名。此外,直接日期比较可能比提取更有效。因此,我建议:

SELECT st.STATE_ABBR as State, count(o.STATION_ID) AS Observations    
FROM TBL_STATES st LEFT JOIN
     TBL_STATIONS sta
     ON st.STATE_ABBR = sta.STATION_STATE LEFT JOIN
     TBL_OBSERVATIONS o
     ON sta.STATION_ID = o.STATION_ID  AND 
        o.OBSERVATION_DATE >= DATE '2015-08-01' AND
        o.OBSERVATION_DATE < DATE '2015-09-01' 
GROUP BY st.STATE_ABBR
ORDER BY st.STATE_ABBR;

只需将日期条件移至ON条款:

因为您似乎想要计算观察值,所以我还将计数固定为来自观察值表。当左联接未找到匹配项时,这一点很重要

我非常喜欢使用表别名。此外,直接日期比较可能比提取更有效。因此,我建议:

SELECT st.STATE_ABBR as State, count(o.STATION_ID) AS Observations    
FROM TBL_STATES st LEFT JOIN
     TBL_STATIONS sta
     ON st.STATE_ABBR = sta.STATION_STATE LEFT JOIN
     TBL_OBSERVATIONS o
     ON sta.STATION_ID = o.STATION_ID  AND 
        o.OBSERVATION_DATE >= DATE '2015-08-01' AND
        o.OBSERVATION_DATE < DATE '2015-09-01' 
GROUP BY st.STATE_ABBR
ORDER BY st.STATE_ABBR;

将WHERE子句更改为,并将条件移动到联接。where子句否定左连接,使其成为内部连接

我们可能还必须先使用子查询来限制结果,然后再加入。。。或者你可能需要计算观测日期而不是观测站状态的发生次数,因为年份不在观测站中

SELECT TBL_STATES.STATE_ABBR as State, count(b.ovservation_date) AS Observations    
FROM  TBL_STATES 
LEFT JOIN TBL_STATIONS ON TBL_STATES.STATE_ABBR = TBL_STATIONS.STATION_STATE
LEFT JOIN (SELECT * FROM TBL_OBSERVATIONS  
           WHERE EXTRACT(year FROM TBL_OBSERVATIONS.OBSERVATION_DATE)='2015'
            AND EXTRACT(month FROM TBL_OBSERVATIONS.OBSERVATION_DATE)='8') B 
  ON TBL_STATIONS.STATION_ID = B.STATION_ID      
GROUP BY STATE_ABBR
ORDER BY STATE_ABBR

逻辑上,左连接返回这些状态的空计数。。。但是where子句正在删除记录,因为没有观测日期,因此2015年为空,记录被排除,否定了左连接。

将where子句更改为,并将条件移动到连接。where子句否定左连接,使其成为内部连接

我们可能还必须先使用子查询来限制结果,然后再加入。。。或者你可能需要计算观测日期而不是观测站状态的发生次数,因为年份不在观测站中

SELECT TBL_STATES.STATE_ABBR as State, count(b.ovservation_date) AS Observations    
FROM  TBL_STATES 
LEFT JOIN TBL_STATIONS ON TBL_STATES.STATE_ABBR = TBL_STATIONS.STATION_STATE
LEFT JOIN (SELECT * FROM TBL_OBSERVATIONS  
           WHERE EXTRACT(year FROM TBL_OBSERVATIONS.OBSERVATION_DATE)='2015'
            AND EXTRACT(month FROM TBL_OBSERVATIONS.OBSERVATION_DATE)='8') B 
  ON TBL_STATIONS.STATION_ID = B.STATION_ID      
GROUP BY STATE_ABBR
ORDER BY STATE_ABBR

逻辑上,左连接返回这些状态的空计数。。。但是where子句正在删除记录,因为没有观测日期,因此2015年为空,记录被排除,否定了左连接。

更改到何处并将条件移动到连接。where子句正在否定左联接,使其成为一个INTERNAR.change to,并将条件移动到该联接。where子句否定了左连接,使其成为一个内部连接。谢谢,但更改了指向何处,并为我提供了完整多年数据集的列表,适当时包括零,但我需要特定月份的结果。修订版仍然返回多年计数,但非常感谢您的帮助。Gordon对我的计数的修正解决了这个问题,并按照您的建议更改了到和的位置。@Gordan就是这么好:P我没有按照我在文本中的建议更改计数。我现在已经更新了,但仍然不确定。坚持Gordan,他会带你去好地方的。谢谢,但更改了位置,并给了我完整多年数据集的列表,包括适当的零,但我需要特定月份的结果。修订版仍然返回多年计数,但非常感谢您的帮助。Gordon对我的计数的修正解决了这个问题,并按照您的建议更改了到和的位置。@Gordan就是这么好:P我没有按照我在文本中的建议更改计数。我现在已经更新了,但仍然不确定。跟着戈丹,他会带你去好地方的。