如何用SQL实现类似Excel COUNTIFS+COUNTIFS的多条件计数功能(处理含piecemark_1、piecemark_2、weld_type字段的大表)
解决大数据量下的Piecemark焊接类型计数问题
嘿,我懂你这种感受——Excel的COUNTIFS对付小数据集顺手得很,但数据量上来之后,不仅卡得要死,还容易出错。咱们用SQL来搞定这个问题,思路其实和你Excel里的逻辑一脉相承,但能轻松hold住大数据量。
核心思路拆解
你之前用UNION合并两个piecemark列的方向是对的,关键是要保留每个piecemark对应的焊接类型信息,然后通过分组聚合实现多条件计数——这就对应Excel里COUNTIFS的多条件逻辑。
具体实现代码
假设你的源表名叫weld_records,咱们分两步走:
第一步:整合两个Piecemark列
先用CTE(临时表)把piecemark_1和piecemark_2的所有数据合并成一列,同时绑定对应的weld_type:
WITH combined_pieces AS ( -- 取出piecemark_1的所有有效数据 SELECT piecemark_1 AS piecemark, weld_type FROM weld_records WHERE piecemark_1 IS NOT NULL UNION ALL -- 取出piecemark_2的所有有效数据(用ALL保留重复行,保证计数准确) SELECT piecemark_2 AS piecemark, weld_type FROM weld_records WHERE piecemark_2 IS NOT NULL )
第二步:多条件分组计数
基于上面的临时表,按piecemark和weld_type分组,统计每个组合的数量:
SELECT piecemark, weld_type, COUNT(*) AS weld_count -- 对应COUNTIFS的计数结果 FROM combined_pieces GROUP BY piecemark, weld_type ORDER BY piecemark, weld_type;
如果需要透视表样式的输出(同Piecemark多列显示不同焊接类型计数)
如果你想要和Excel透视表一样,把不同weld_type的计数放在同一行,可以用条件聚合的写法(适配大多数数据库):
WITH combined_pieces AS ( SELECT piecemark_1 AS piecemark, weld_type FROM weld_records WHERE piecemark_1 IS NOT NULL UNION ALL SELECT piecemark_2 AS piecemark, weld_type FROM weld_records WHERE piecemark_2 IS NOT NULL ) SELECT piecemark, -- 统计TypeA的数量 COUNT(CASE WHEN weld_type = 'TypeA' THEN 1 END) AS typeA_count, -- 统计TypeB的数量 COUNT(CASE WHEN weld_type = 'TypeB' THEN 1 END) AS typeB_count, -- 可以继续添加其他焊接类型的统计 COUNT(*) AS total_welds FROM combined_pieces GROUP BY piecemark ORDER BY piecemark;
为什么这个方法适合大数据量
- 数据库的分组聚合是经过底层优化的,处理百万级甚至更大的数据集都比Excel高效得多,不会出现卡顿或崩溃。
- 逻辑清晰易维护:如果后续需要加过滤条件(比如只统计某段时间的数据),直接在CTE里加
WHERE子句就行,灵活度拉满。
内容的提问来源于stack exchange,提问作者Fauzi Yahaya
相关产品推荐
相关产品推荐

