You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无主键表的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 01:42:15