当前位置:   article > 正文

PGSQL CASE WHEN的应用

pgsql case when

前言   

    有些业务直接使用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,就让累加上这一条,所以就计算来了待确认的数量 ,其他的也如法炮制

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

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

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

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

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

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

  1. SELECT
  2. pu."Name",
  3. pet.*,
  4. -- 结果保留两位小数
  5. ROUND( ( "Completed" / "Count" ) * 100, 2 ) AS "PercentageComplete"
  6. FROM
  7. (
  8. SELECT
  9. "UserId",
  10. SUM ( CASE et."Status" WHEN '0' THEN 1 ELSE 0 END ) AS "ToBeConfirmed",
  11. SUM ( CASE et."Status" WHEN '5' THEN 1 ELSE 0 END ) AS "BeingProcessed",
  12. SUM ( CASE et."Status" WHEN '6' THEN 1 ELSE 0 END ) AS "ToBeRviewed",
  13. SUM ( CASE et."Status" WHEN '10' THEN 1 ELSE 0 END ) AS "Completed",
  14. SUM ( CASE et."Status" WHEN '15' THEN 1 ELSE 0 END ) AS "Revoked",
  15. COUNT ( * ) AS "Count"
  16. FROM
  17. "Pipe_EventTask" AS et
  18. GROUP BY
  19. "UserId"
  20. ) AS pet
  21. LEFT JOIN "Pipe_Users" pu ON pet."UserId" = pu."Id"
  22. WHERE
  23. pet."UserId" = '10'
  24. AND pu."Name" LIKE'%测试%'
  25. ORDER BY
  26. "PercentageComplete" ASC OFFSET 0
  27. LIMIT 1

结尾

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/493033
推荐阅读
相关标签
  

闽ICP备14008679号