无主键表的SQL查询需求:筛选全分支无销售的零件编号
解决方案:筛选所有分支销售历史全为0的零件编号
需求回顾
现有一张按分支存储零件销售历史的表,零件可对应单个或多个分支,表中包含当月及前3个月的销售数据列。需编写SQL查询,找出所有分支的这4个销售列数据均为0的零件编号(例如样本数据中Part# 56789符合要求,Part# 12345因某分支SalesHist02有记录被排除),且表数据量较大(29万+唯一零件、130万+行),需兼顾查询性能。
假设表结构
基于样本数据,假设表名为part_sales,核心字段如下:
Part#:零件编号Branch:分支标识SalesHist01:当月销售额SalesHist02:前1个月销售额SalesHist03:前2个月销售额SalesHist04:前3个月销售额
方法一:排除有非0销售记录的零件(推荐大表场景)
通过子查询先找出所有存在非0销售的零件,再取补集得到目标结果,适合非0记录占比低的场景,效率较高:
SELECT DISTINCT `Part#` FROM part_sales WHERE `Part#` NOT IN ( SELECT DISTINCT `Part#` FROM part_sales WHERE SalesHist01 <> 0 OR SalesHist02 <> 0 OR SalesHist03 <> 0 OR SalesHist04 <> 0 );
方法二:分组聚合验证全0
通过分组后聚合每个零件的销售列最大值,若最大值为0则说明所有分支的该列均为0:
SELECT `Part#` FROM part_sales GROUP BY `Part#` HAVING MAX(SalesHist01) = 0 AND MAX(SalesHist02) = 0 AND MAX(SalesHist03) = 0 AND MAX(SalesHist04) = 0;
性能优化建议
针对大表场景,可通过以下方式提升查询速度:
- 建立复合索引:为
Part#和4个销售列创建复合索引,帮助数据库快速筛选和分组数据:CREATE INDEX idx_part_sales ON part_sales (`Part#`, SalesHist01, SalesHist02, SalesHist03, SalesHist04); - 根据数据分布选择方法:若非0销售记录占比低,优先使用方法一;若需同时统计零件的分支数等额外信息,方法二更灵活。
内容的提问来源于stack exchange,提问作者AndyC
相关产品推荐
相关产品推荐

