如何在Oracle SQL中包含计数为零()的美国州?
我正在努力为Oracle db创建一个查询,该查询将为每个未在此查询结果中表示的美国州返回0:如何在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
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我没有按照我在文本中的建议更改计数。我现在已经更新了,但仍然不确定。跟着戈丹,他会带你去好地方的。