【发布时间】:2012-05-14 20:02:32
【问题描述】:
下载由下载时间、下载时间 ID 和 buno ID 组成。 故障由故障代码、下载时间 ID、状态和类型组成。一次下载可以有很多错误,可以在下载时间id上加入。
给定一组故障代码,结果必须包含每个故障代码和相应的故障计数。如果在下载中没有找到故障代码,则必须返回故障代码,故障计数为零。
这个问题似乎需要一个 OUTER JOIN,但在 Postgres 上没有看到它按预期工作,因为它似乎没有从 LEFT 表返回带有空值的集合。
查询如下,为简洁起见省略了一些细节:
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
谢谢大家的帮助!喜欢这个网站!
【问题讨论】:
-
您分析过您的数据吗?我怀疑这是 PostgreSQL 中的问题……您能提供SQL Fiddle 中的表结构和示例数据吗?
-
download_time d LEFT OUTER JOIN fs_fault f ON f.downloadtimeid = d.id将download_time作为左表,而不是fs_fault。联接条件与联接中的左表或右表无关。
标签: sql postgresql