赞
踩
有些业务直接使用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
在做业务时,思路很重要,就算不知道一些数据库的内置函数,也不影响毕竟还可以面向百度编程,最后祝大家程序永不报错!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。