mysql - 使用另一个 GROUP BY 过滤 GROUP BY 结果以进行缩减

标签 mysql sql group-by

我已经有一个基本查询来从数据库中选择所有位置,然后按邮政编码的前 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/

相关文章:

sql - 在 MS SQL 中用单个逗号替换多个逗号

mysql - 我怎样才能找到借方和贷方平衡的客户?

MySQL - 如何根据数据选择连续行

python - 使用 MySQLdb 在 Python 中执行 .sql 文件

sql - Oracle SQL - 将主键添加到表

mysql - 连接3个表并对不同字段进行计数

sql - 将 "group by"查询中的值插入到另一个表中

mysql - 关联同一个表中的多个列

php - MySQL 返回一些行 3 次

SQL MAX 函数奇怪的行为