mysql中聚合函数条件

有个需求,某张表,有个状态字段(1:成功,2:失败,类似这样的),现要用日期分组统计不同状态下的数量

先写了个子查询:


select aa.logDate,aa.totalLogs 
,(select count(1) from dxp.dxp_handlermodel where aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d') and executeStatus=1) pendingLogs
,(select count(1) from dxp.dxp_handlermodel where aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d') and executeStatus=2) successLogs
,(select count(1) from dxp.dxp_handlermodel where aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d') and executeStatus=3) errorLogs
,(select count(1) from dxp.dxp_handlermodel where aa.logDate=DATE_FORMAT( startTime, '%Y-%m-%d') and executeStatus=4) callbackErrorLogs
from
(
select
DATE_FORMAT( a.startTime, '%Y-%m-%d') logDate,
count(1) totalLogs
from dxp.dxp_handlermodel a 
group by DATE_FORMAT( a.startTime, '%Y-%m-%d') 
) aa 


执行相当慢,想到count中能不能加条件,找了一下,如下:

select
DATE_FORMAT( startTime, '%Y-%m-%d') logDate,
count(1) totalLogs,
count(if(executeStatus=1,true,null)) pendingLogs,
count(if(executeStatus=2,true,null)) successLogs,
count(if(executeStatus=3,true,null)) errorLogs,
count(if(executeStatus=4,true,null)) callbackErrorLogs
from dxp.dxp_handlermodel
group by DATE_FORMAT( startTime, '%Y-%m-%d') 

 

简明易懂,且执行效率非常高

其它的聚合函数也可以用,如SUM等

居然之前不知道,真不知道当年的报表项目是咋做的,记录一下

 

 

### MySQL 聴集函数及其条件应用 #### 基本概念 MySQL聚合函数用于执行特定计算并返回单个值。常见的聚合函数包括 `MIN()`、`MAX()`、`SUM()` 和 `GROUP_CONCAT()` 等[^1]。 #### 条件的应用方式 当需要在聚合函数中加入条件时,可以利用 SQL 提供的控制流语句来实现。例如,在 `SELECT` 查询中嵌套使用 `IF()` 或者 `CASE WHEN THEN ELSE END` 表达式,从而动态调整数据筛选逻辑[^3]。 以下是具体示例: --- #### 示例 1: 使用 IF() 添加条件 (COUNT) 假设有一个表名为 `profile_visit_log`,记录用户的访问日志。如果要统计某个日期之前某用户的具体访问次数,则可以通过如下查询完成: ```sql SELECT COUNT( IF(create_date < '2017-01-01' AND host_profile_id = '9294d2bf-f457-4fe5-9a36-e5f832310dc2', TRUE, NULL) ) AS visit_count FROM profile_visit_log; ``` 此查询通过 `IF()` 判断每条记录是否满足给定条件,并仅对符合条件的数据计数。 --- #### 示例 2: 使用 CASE WHEN 实现更复杂的条件 (SUM) 对于考试成绩表 (`exam_result`),若需按科目分类求和,可采用以下写法: ```sql SELECT subject, SUM(CASE WHEN grade >= 60 THEN score ELSE 0 END) AS passed_score_sum FROM exam_result WHERE subject = 'Math' GROUP BY subject; ``` 这里运用了 `CASE WHEN` 结构定义了一个简单的业务规则——只有分数大于等于 60 才计入总分[^2]。 --- #### 示例 3: 多字段组合过滤 (GROUP_CONCAT) 考虑场景:有一张员工技能清单表格 `employee_skills` ,其中包含员工 ID 及其对应的技能名称。现在希望查看每位员工所具备的所有技能列表。 ```sql SELECT employee_id, GROUP_CONCAT(skill_name SEPARATOR ', ') AS skills_list FROM employee_skills WHERE skill_level > 3 -- 这里添加额外约束条件 GROUP BY employee_id; ``` 上述代码片段展示了如何借助 `GROUP_CONCAT` 将多行结果拼接为单一字符串形式的同时支持附加过滤器操作[^4]。 --- #### 综合说明 以上各例子均体现了不同类型的聚合运算配合相应限定条款的实际应用场景。值得注意的是,尽管这些技术手段能够极大增强灵活性,但在实际开发过程中也应注重性能优化以及SQL书写清晰度等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

onemy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值