如何统计含零件组合的表中各单个零件总使用次数(SQL/Excel实现)
实现方案
SQL和Excel都可以完成这个统计需求,核心逻辑一致:先把组合格式的零件编号拆成单个零件条目,同个组合里重复出现的零件按实际出现次数计数,再把每个单个零件对应的所有计数值累加即可。
Excel 实现方法
用Power Query即可快速完成,不需要写复杂VBA,自动适配+、,两种分隔符:
- 选中原始数据区域,点击「数据」选项卡-「从表格/区域」,将数据导入Power Query编辑器
- 新增自定义列,输入以下公式将零件字符串拆分为单个零件组成的列表:
该公式会自动识别两种分隔符完成拆分,比如= Text.SplitAny([Part Number], "+,")D+D+D会被拆为{"D","D","D"},A,C会被拆为{"A","C"} - 选中新增的自定义列,点击「转换」选项卡-「展开到行」,列表内的每个零件会单独占一行,原始行的Count值会自动匹配到每一条拆分后的记录
- 对展开后的零件列执行分组操作,聚合规则选择对Count列求和,即可得到最终的总计数结果,导出到普通工作表即可使用。
SQL 实现方法
核心是通过字符串拆分逻辑拆解组合零件,以MySQL 8.0+版本为例,假设原始表名为part_usage,存储字段为part_number(零件编号字符串)、cnt(对应计数),代码如下:
WITH RECURSIVE split_part AS ( -- 初始化:统一分隔符,取出第一个零件,标记剩余待拆分字符串 SELECT cnt, TRIM(SUBSTRING_INDEX(part_number, sep, 1)) AS single_part, IF( LOCATE(sep, part_number) = 0, '', SUBSTRING(part_number, LOCATE(sep, part_number) + 1) ) AS rest_str FROM ( SELECT cnt, REPLACE(part_number, ',', '+') AS part_number, '+' AS sep FROM part_usage ) t UNION ALL -- 递归拆分剩余字符串,直到没有待拆分内容 SELECT cnt, TRIM(SUBSTRING_INDEX(rest_str, sep, 1)) AS single_part, IF( LOCATE(sep, rest_str) = 0, '', SUBSTRING(rest_str, LOCATE(sep, rest_str) + 1) ) AS rest_str FROM split_part WHERE rest_str <> '' ) -- 按单个零件分组求和得到最终结果 SELECT single_part AS `Part Number`, SUM(cnt) AS `Total Count` FROM split_part GROUP BY single_part ORDER BY single_part;
针对你给出的示例数据,执行后输出结果完全匹配预期:
| Part Number | Total Count |
|---|---|
| A | 13 |
| B | 9 |
| C | 11 |
| D | 37 |
如果使用其他SQL方言,比如PostgreSQL可直接用
string_to_table函数、SQL Server可用string_split配合交叉关联实现,核心逻辑完全一致,仅拆分函数的写法存在区别。
内容的提问来源于stack exchange,提问作者SkreeScroll
相关产品推荐
相关产品推荐

