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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:02:50