返回重复计数和不同行

时间:2015-04-05 13:49:09

标签: sql oracle

我正在编写一个用作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;

1 个答案:

答案 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