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
相关产品推荐
相关产品推荐

