PGSQL CASE WHEN的应用

文章介绍了如何通过SQL查询对业务数据进行统计,包括使用GROUPBY对用户ID进行分组,以及运用CASEWHEN函数处理不同状态的计数。作者展示了如何统计待确认、处理中等工单状态,最后通过JOIN查询用户表获取用户名和完成率。
摘要由CSDN通过智能技术生成

前言   

    有些业务直接使用sql进行查询,不仅查询效率更高,而且开发效率也比通过在代码中进行查询高。

        不墨迹,直接上业务截图,这里需要一个查询工单统计的接口(数据都在一张表中,且同一个用户在表中有条数据)

        

正文

思路:

一、同一个用户有多条数据,首先考虑使用分组 "GROUP BY" 关键字实现对用户的id进行分组查询,可以看到经过分组之后,用户Id为10的总共有1条数据

SELECT "UserId",count(*) FROM "Pipe_EventTask" GROUP BY "UserId" 

二、虽然现在我们已经拿到了列表中所需的两条数据,用户id(用户名称),总数。

来看其余的几个字段如何查询,已知该表中有一个状态(Status)字段用来表示当前工单的状态,这个时候就可以寄出我们的CASE WHEN函数了

这个函数可以理解为switch或者是if else,语法如下

SELECT "UserId",count(*),SUM ( CASE "Status" WHEN '0' THEN 1 ELSE 0 END ) AS "ToBeConfirmed"  FROM "Pipe_EventTask" GROUP BY	"UserId"

解读一下,这里我们为什么要在CASE前用一个SUM函数,因为这是分组之后,所以需要使用聚合函数,不然会报错,代码片段具体意思就是,当状态为Status字段的值为'0'时就返回1,否则就返回0,为什么是Status是'0'就返回1,因为我们使用了聚合函数,如果满足状态为1,就让累加上这一条,所以就计算来了待确认的数量 ,其他的也如法炮制

三、接下来就是复制粘贴的工作了,将状态不同的都给统计出来(具体字段为了方便实体类映射,我替换为了具体的翻译)

SELECT "UserId",
		SUM ( CASE et."Status" WHEN '0' THEN 1 ELSE 0 END ) AS "ToBeConfirmed",
		SUM ( CASE et."Status" WHEN '5' THEN 1 ELSE 0 END ) AS "BeingProcessed",
		SUM ( CASE et."Status" WHEN '6' THEN 1 ELSE 0 END ) AS "ToBeRviewed",
		SUM ( CASE et."Status" WHEN '10' THEN 1 ELSE 0 END ) AS "Completed",
		SUM ( CASE et."Status" WHEN '15' THEN 1 ELSE 0 END ) AS "Revoked",
		COUNT ( * ) AS "Count" 
	FROM
		"Pipe_EventTask" AS et 
	GROUP BY	
		"UserId" 

四、现在已经查询出来了大多数字段,还有一个用户名与工单完成率,用户名通过用户id,JOIN连表查询用户表,就可以查询。完成率通过(完成数/总数)* 100即可,这里就不过多赘述

    1.ROUND(列名,保留小数位)   因为是百分比

    2.用了一个将查询结果当做单独表使用,第一个form后就是第三步的查询语句,为什么怎么做,为了方便关联查询用户表(有大佬可以分享一下分组后关联查询怎么做较好)

    3.最后就是做了一些例如条件查询,排序,分页查询,对整个sql做了最后的补充

SELECT
	pu."Name",
	pet.*,
    -- 结果保留两位小数
	ROUND( ( "Completed" / "Count" ) * 100, 2 ) AS "PercentageComplete" 
FROM
	(
	SELECT
		"UserId",
		SUM ( CASE et."Status" WHEN '0' THEN 1 ELSE 0 END ) AS "ToBeConfirmed",
		SUM ( CASE et."Status" WHEN '5' THEN 1 ELSE 0 END ) AS "BeingProcessed",
		SUM ( CASE et."Status" WHEN '6' THEN 1 ELSE 0 END ) AS "ToBeRviewed",
		SUM ( CASE et."Status" WHEN '10' THEN 1 ELSE 0 END ) AS "Completed",
		SUM ( CASE et."Status" WHEN '15' THEN 1 ELSE 0 END ) AS "Revoked",
		COUNT ( * ) AS "Count" 
	FROM
		"Pipe_EventTask" AS et 
	GROUP BY	
		"UserId" 
	) AS pet
	LEFT JOIN "Pipe_Users" pu ON pet."UserId" = pu."Id" 
WHERE
	pet."UserId" = '10' 
	AND pu."Name" LIKE'%测试%' 
ORDER BY
	"PercentageComplete" ASC OFFSET 0 
	LIMIT 1

结尾

        在做业务时,思路很重要,就算不知道一些数据库的内置函数,也不影响毕竟还可以面向百度编程,最后祝大家程序永不报错!!!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值