我已经有一个基本查询来从数据库中选择所有位置,然后按邮政编码的前 2 个字符对它们进行分组。
SELECT LEFT(`locationPostcode`, 2) as `postcode`, count(`locationPostcode`) as `locationCount`
FROM `locations`
WHERE `locationPostcode` IS NOT NULL
AND `locationPostcode` <> ''
GROUP BY `postcode`
ORDER BY `locationCount` DESC
由于某些邮政编码仅以 1 个字母字符开头,而不是 2 个,因此我需要再次对其进行分组以使这些邮政编码(例如 E1、W2)仅显示其第一个字母。
我的尝试是通过 LEFT('postcode', 2)
将它们再次分组,但似乎没有太大效果(下面的查询)
SELECT postcode, locationCount FROM (
SELECT LEFT(`locationPostcode`, 2) as `postcode`, count(`locationPostcode`) as `locationCount`
FROM `locations`
WHERE `locationPostcode` IS NOT NULL
AND `locationPostcode` <> ''
GROUP BY `postcode`
ORDER BY `locationCount` DESC
) as `outer`
GROUP BY left(`postcode`, 1)
ORDER BY `locationCount` DESC
澄清:我希望实际的邮政编码结果如下:
postcode | count
----------------
E | 3000
W | 2200
SW | 1300
而不是:
postcode | count
----------------
SW | 1300
E1 | 1000
E2 | 300
S1 | 200
S2 | 100
S3 | 50
最佳答案
您的问题描述建议使用分组依据
的条件情况:
SELECT (case when substr(locationPostcode, 2, 1) between 'A' and 'Z'
then left(`locationPostcode`, 2)
else left(locationPostcode, 1)
end) as postcode_prefix, count(`locationPostcode`) as `locationCount`
FROM `locations`
WHERE `locationPostcode` IS NOT NULL AND `locationPostcode` <> ''
GROUP BY postcode_prefix
ORDER BY `locationCount` DESC;
关于mysql - 使用另一个 GROUP BY 过滤 GROUP BY 结果以进行缩减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34268005/