我正在编写一个用作PL / SQL游标的SQL语句,它根据邮局提供的POSTCODES表检查SUBURB字段。绝大多数郊区只有一个邮政编码,但是:
为了避免不必要地访问数据库,并避免在我的结果中有重复的地址,如果有一个对应于郊区的邮政编码,我想返回一个POSTCODE值,否则返回null,并且CODES_IN_SUBURB计数为null如果找不到郊区,但是否则计算该郊区有多少不同的邮政编码。
我认为我很接近,但是我在解决如何修改CODES_IN_SUBURB的一半而不重复自己时遇到了一些麻烦。如果我在没有count = 1 WHERE子句的情况下加入,我会得到重复的地址。如果我把它留在里面,我就不能按照我想要的方式使用CODES_IN_SUBURB。什么是最好的方法呢?
SELECT dirty_data.street1,
dirty_data.suburb,
nsw_postcodes.postcode
FROM dirty_data
LEFT JOIN ( SELECT postcodes.locality, postcode, dupes.codes_in_suburb
FROM postcodes
INNER JOIN (SELECT locality, count(*) codes_in_suburb
FROM postcodes
WHERE state = 'NSW'
GROUP BY locality) dupes
ON dupes.locality = postcodes.locality
WHERE state = 'NSW' AND dupes.codes_in_suburb = 1) nsw_postcodes
ON nsw_postcodes.locality = dirty_data.suburb;
答案 0 :(得分:2)
如何使用一些条件子句进行简单聚合?
SELECT locality,
(CASE WHEN COUNT(*) = 1 THEN MAX(postcode)
END) as postcode,
COUNT(*) as codes_in_suburb
FROM postcodes
WHERE state = 'NSW'
GROUP BY locality;
如果该地区只有一个邮政编码,那么MAX(postcode)
将返回该邮政编码。否则(0或大于1),case
将返回NULL
。