SQL分组查询:如何筛选出拥有多个分店的店铺数据
筛选拥有多个分店的店铺数据的SQL实现方案
刚好碰到过类似的需求,给你两种靠谱的实现方式,都能精准筛选出你要的结果:
方法一:子查询关联法(兼容大部分数据库)
这种方法先统计每个店铺(按store_name+country分组)的分店数量,再筛选出分店数大于1的店铺,最后关联原表获取所有对应记录:
SELECT s.* FROM `store` s JOIN ( -- 先找出分店数>1的店铺(按store_name和country分组) SELECT `store_name`, `country` FROM `store` GROUP BY `store_name`, `country` HAVING COUNT(`branch`) > 1 ) AS sub ON s.`store_name` = sub.`store_name` AND s.`country` = sub.`country` ORDER BY s.`store_name`, s.`branch`;
逻辑说明:
- 子查询里通过
GROUP BY按店铺名称和国家分组,用HAVING COUNT(branch) > 1过滤出拥有多个分店的店铺组合; - 原表
store和这个子查询做关联,只保留那些在子查询里的店铺的所有分店记录。
方法二:窗口函数法(适用于支持窗口函数的数据库,如MySQL8.0+、PostgreSQL等)
如果你的数据库支持窗口函数,这种写法更简洁,性能也更优:
SELECT `store_name`, `country`, `branch` FROM ( -- 给每条记录标记其所属店铺的分店总数 SELECT *, COUNT(*) OVER(PARTITION BY `store_name`, `country`) AS branch_count FROM `store` ) AS sub -- 只保留分店总数>1的记录 WHERE branch_count > 1 ORDER BY `store_name`, `branch`;
逻辑说明:
- 内层查询用
PARTITION BY store_name, country将数据按店铺和国家分区,COUNT(*) OVER()计算每个分区内的行数(也就是该店铺的分店数); - 外层查询直接过滤出
branch_count > 1的行,就能得到所有多分店店铺的记录。
两种方法都能得到你预期的查询结果,你可以根据自己使用的数据库版本选择合适的方案~
内容的提问来源于stack exchange,提问作者Autodesk
相关产品推荐
相关产品推荐

