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

SQL新手求助:如何创建命名WHERE条件并在单查询中统计

可行,用条件聚合实现你的需求

你要的功能完全可以实现,核心是用条件聚合——结合CASE表达式和聚合函数(比如COUNT()或SUM()),在单个查询里同时统计多个条件的符合情况。

你的原代码问题

你尝试的写法不符合SQL语法规则:子查询中不能重复使用WHERE子句来定义命名条件,这种写法会直接导致语法错误。

正确实现方法

下面提供两种常用的实现方式,你可以根据需求选择:

方式1:先标记条件,再分组统计

先在子查询里用CASE给每条数据打上是否符合目标条件的标记(1表示符合,0表示不符合),外层查询再按需要的维度分组并统计:

SELECT 
    dt,
    lkey,
    node,
    sgw,
    cause_code,
    sub_cause_code,
    -- 统计符合Data_0_60sec的数量(补充你的实际条件即可)
    SUM(Data_0_60sec_flag) AS Data_0_60sec_count,
    SUM(Data_61_300sec_flag) AS Data_61_300sec_count,
    SUM(Data_over_5mins_flag) AS Data_over_5mins_count,
    -- 统计当前分组的总数据量
    COUNT(*) AS total_count
FROM (
    SELECT 
        *,
        -- 标记是否符合Data_over_5mins条件
        CASE 
            WHEN service_request_type = 'a' 
                AND l_service_req_trigger = 'b' 
                AND paging_attempts_enb = '0' 
                AND paging_attempts_enb_list = '0' 
                AND paging_attempts_ta = '0' 
                AND paging_attempts_ta_list = '4' 
            THEN 1 
            ELSE 0 
        END AS Data_over_5mins_flag,
        -- 标记是否符合Data_61_300sec条件
        CASE 
            WHEN service_request_type = 'c' 
                AND l_service_req_trigger = 'd' 
                AND paging_attempts_enb = '0' 
                AND paging_attempts_enb_list = '1' 
                AND paging_attempts_ta = '2' 
                AND paging_attempts_ta_list = '0' 
            THEN 1 
            ELSE 0 
        END AS Data_61_300sec_flag,
        -- 替换成Data_0_60sec的实际条件
        CASE WHEN [你的Data_0_60sec条件] THEN 1 ELSE 0 END AS Data_0_60sec_flag
    FROM table_1
    WHERE date = 'y' -- 字符串类型值需加单引号,日期类型确保格式匹配
) AS sub_query
GROUP BY 
    dt,
    lkey,
    node,
    sgw,
    cause_code,
    sub_cause_code;

方式2:直接在聚合时判断条件(更简洁)

不需要子查询,直接在SELECT里用COUNT(CASE...)统计符合每个条件的数量:

SELECT 
    dt,
    lkey,
    node,
    sgw,
    cause_code,
    sub_cause_code,
    -- 统计Data_0_60sec的数量(替换成你的实际条件)
    COUNT(CASE WHEN [你的Data_0_60sec条件] THEN 1 END) AS Data_0_60sec_count,
    -- 统计Data_61_300sec的数量
    COUNT(CASE 
            WHEN service_request_type = 'c' 
                AND l_service_req_trigger = 'd' 
                AND paging_attempts_enb = '0' 
                AND paging_attempts_enb_list = '1' 
                AND paging_attempts_ta = '2' 
                AND paging_attempts_ta_list = '0' 
            THEN 1 
        END) AS Data_61_300sec_count,
    -- 统计Data_over_5mins的数量
    COUNT(CASE 
            WHEN service_request_type = 'a' 
                AND l_service_req_trigger = 'b' 
                AND paging_attempts_enb = '0' 
                AND paging_attempts_enb_list = '0' 
                AND paging_attempts_ta = '0' 
                AND paging_attempts_ta_list = '4' 
            THEN 1 
        END) AS Data_over_5mins_count,
    -- 总数据量
    COUNT(*) AS total_count
FROM table_1
WHERE date = 'y'
GROUP BY 
    dt,
    lkey,
    node,
    sgw,
    cause_code,
    sub_cause_code;

关键说明

  • COUNT(CASE...)会自动忽略CASE返回NULL的行(不符合条件的行),从而精准统计符合条件的数量;用SUM(CASE...)也能达到同样效果。
  • 把代码中的[你的Data_0_60sec条件]替换成你实际的筛选逻辑即可。
  • 如果date是日期类型,要确保'y'的格式与字段类型匹配,避免查询错误。

内容的提问来源于stack exchange,提问作者CmdCarlisle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:20:33