一个下载包括下载时间、下载时间id和buno ID。
故障包括故障代码、下载时间id、状态和类型。一个下载可以有很多故障,并且可以根据下载时间id进行连接。
给定一组故障代码,结果必须包含每个故障代码及其相应的故障计数。如果在下载中未找到故障代码,则必须返回故障代码以及故障计数为零。
该问题似乎需要使用外部连接,但是在Postgres上看不到它按预期工作,因为它似乎没有从LEFT表返回带有nulls的集合。
以下是查询语句,其中省略了一些详细信息:
给定一组故障代码,结果必须包含每个故障代码及其相应的故障计数。如果在下载中未找到故障代码,则必须返回故障代码以及故障计数为零。
该问题似乎需要使用外部连接,但是在Postgres上看不到它按预期工作,因为它似乎没有从LEFT表返回带有nulls的集合。
以下是查询语句,其中省略了一些详细信息:
SELECT f.faultcode, f.downloadtimeid, d.downloadtime, count(*) as faultcount
FROM download_time d
LEFT OUTER JOIN fs_fault f ON f.downloadtimeid = d.id
AND f.faultcode IN (1000,1100)
AND f.statusid IN(2, 4)
WHERE (d.downloadtime BETWEEN '04/11/2011' AND '05/01/2012')
AND d.bunoid = 166501
GROUP BY d.bunoid, f.downloadtimeid, d.downloadtime, f.faultcode
第二天,我进行了编辑并显示了答案。所有答案都很接近并且提供了各种帮助元素。然而,JayC的回答最接近。这是最终的SQL,唯一的变化是WHERE子句采用故障代码IN语句:
SELECT f.faultcode, f.downloadtimeid, d.downloadtime, count(*) as faultcount
FROM download_time d
RIGHT OUTER JOIN fs_fault f ON f.downloadtimeid = d.id
AND f.statusid IN(2, 4)
AND d.downloadtime BETWEEN '04/11/2011' AND '05/01/2012'
AND d.bunoid = 166501
WHERE f.faultcode IN (1000,1100)
GROUP BY d.bunoid, f.downloadtimeid, d.downloadtime, f.faultcode
感谢大家的帮助!喜欢这个网站!
download_time d LEFT OUTER JOIN fs_fault f ON f.downloadtimeid = d.id
中的左侧表是download_time
,而不是fs_fault
。连接条件与表在连接中的左右位置无关。 - JayC