【mysql】case...when...、group...by、sum() 聚合函数... 企业组合使用实际场景示例

查询需求场景

-- 统计当月不同流程类型的审批通过流程数、审批终止流程数、审批驳回流程数、新增流程数(归档+终止+退回)、申请总条目数(关联任务单申请条目数总数)

-- 查询思路:
-- 1. 获取当月创建的所有流程  tn_workflow_instance_node(create_time like concat( '2024-09', '%') && node_no = 1 )
-- 2. 按照流程类型进行分组:新增、扩充、冻结、解冻、变更
-- 3. 统计每个组内不同审批状态(终止、退回、归档)总数
-- 4. 关联任务单统计申请条目总数


-- tn_workflow_instance_node 流程实例节点表 (统计流程发起时间在本月内及关联流程实例和任务单用到)
-- tn_workflow_instance 流程实例表 (统计流程的状态是通过、退回、终止时关联用到)
-- tn_work_task 任务单表 (统计流程关联任务单审批的总条目数用到)

预设查询结果

如下:
在这里插入图片描述

SQL实现查询

SELECT
	CASE
		wn.workflow_id 
		WHEN 'WF12304702' THEN
		'扩充' 
		WHEN 'WF182295840' THEN
		'冻结' 
		WHEN 'WF30500982' THEN
		'新增' 
		WHEN 'WF657578194' THEN
		'变更' 
		WHEN 'WF734432211' THEN
		'解冻' 
		ELSE 'Unknown' 
	END AS 流程类型,
	SUM( CASE WHEN wi.STATUS = 'archived' THEN 1 ELSE 0 END ) AS 审批通过总数,
	SUM( CASE WHEN wi.STATUS = 'suspend' THEN 1 ELSE 0 END ) AS 审批中止总数,
	SUM( CASE WHEN wi.STATUS = 'return' THEN 1 ELSE 0 END ) AS 审批退回总数,
	SUM( CASE WHEN wi.STATUS IN ( 'return', 'suspend', 'archived' ) THEN 1 ELSE 0 END ) AS 新增流程总数,
	SUM( wt.apply_count ) AS 任务单申请总条目数 
FROM
	tn_workflow_instance_node wn
	JOIN tn_workflow_instance wi ON wn.workflow_instance_id = wi.workflow_instance_id
	JOIN tn_work_task wt ON wi.task_id = wt.task_id 
WHERE
	wn.create_time LIKE concat( '2024-09', '%' ) 
	AND wn.node_no = 1 
	AND wi.STATUS IN ( 'return', 'suspend', 'archived' ) 
GROUP BY
	wn.workflow_id
	
	

	
	

	

查询结果:

在这里插入图片描述

### MySQL 中显示查询结果为0的数据方法 在 SQL 查询中,如果希望返回的结果集中某些条件下的值显示为 `0`,可以采用多种方式实现。以下是几种常见的解决方案: #### 使用 `CASE WHEN` 语句 通过 `CASE WHEN` 可以灵活地控制查询结果中的特定值。例如,当某个字段小于零时将其显示为 `0`[^4]。 ```sql SELECT ID, EQUIP_NO, EQUIP_NAME, STORAGE_NO, DRUG_ID, DRUG_NAME, CURRENT_HEIGHT, STATUS, CASE WHEN QUANTITY < 0 THEN 0 ELSE QUANTITY END AS QUANTITY, PALLET_TYPE, INDEX_NO, VALID_DATE, LOT_NO FROM eq_equipment_storage_drugs; ``` 上述代码展示了如何将负数转换为 `0` 并保持其他正常数值不变。 #### 利用聚合函数与 `IFNULL` 有时查询可能涉及统计操作(如 `COUNT()` 或者 `SUM()`),而这些操作可能会忽略不存在的记录或者返回 `NULL` 值。为了确保即使没有任何匹配项也能得到 `0` 的结果,可结合 `IFNULL` 函数使用[^3]。 ```sql SELECT department_id, IFNULL(COUNT(employee_id), 0) as employee_count FROM employees GROUP BY department_id; ``` 此例子说明了即便某部门没有雇员的情况下仍会显示出计数为 `0` 的情况。 #### 结合变量设置行号并初始化默认值 对于需要给每条记录附加唯一编号的任务,则可以通过定义用户变量来完成这一目标。下面的例子演示了如何基于已有查询基础上增加连续序号列的同时设定初始状态为 `0`[^1]。 ```sql SET @rownum = 0; SELECT (@rownum := @rownum + 1) AS rownum, phone FROM ( SELECT phone FROM t_equity_new_receive WHERE equity_no='3000000003' AND receive_data<'20190731' GROUP BY create_time ) a, (SELECT @rownum := 0) AS rn; ``` 以上脚本首先设置了全局变量 `@rownum` 的起始值为 `0` ,接着在外层查询里逐步累加该变量作为新产生的序列号。 #### 数据插入过程中处理异常值 如果有需求要把经过修改后的数据保存回数据库表内,那么可以在执行更新前先做好相应的调整工作再提交入库[^2]。 ```sql INSERT INTO target_table(phone, quantity) SELECT phone, CASE WHEN source_quantity < 0 THEN 0 ELSE source_quantity END AS adjusted_quantity FROM source_table; ``` 这里假设有一个源表格包含了原始数量信息(`source_quantity`) , 我们只取正值部分存入目的表当中. 综上所述,针对不同场景下要求展示查询结果等于零的情况提供了几个典型解决办法。具体应用还需依据实际业务逻辑做出适当的选择和定制化开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码元宋大米

感谢小主大赏,留言可进互助群~

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

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

打赏作者

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

抵扣说明:

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

余额充值