首页 > 数据库 >MS SQL 竟然被一个分组求和的问题卡了半天

MS SQL 竟然被一个分组求和的问题卡了半天

时间:2024-07-29 18:30:41浏览次数:16  
标签:SQL 医疗期 分组 MS 王五 102 103 101 nameid

最近有个人员考勤的项目,要判断员工请病假是否超出了医疗期, 本以为很简单的需求,却频频出错
情况如下:
首先每个员工根据资历不同,有不同的医疗期 ,这个医疗期呢每个员工还有不同的计算周期,比如A员工在12个月内病假超过3个月就算超出医疗期,B员工在15个月内病假超过4个月就算超出医疗期.
数据库里的人员资料里已经根据资历等条件计算出了病假的计算周期和医疗期。也有一张表存储着每个月的病假天数。

表1 基础资料表 A01

  •         人员ID   姓名   医疗期  计算周期 
    
  •        nameid   name     ylq    jszq
    
  •         101     张三      3      4
    
  •         102     李四      2      5
    
  •         103     王五      4      6
    

首先和客户确认的是医疗期按照30天来计算月,就是张三在4个月内病假天数不超过90天就算不超医疗期,不考虑大小月

表2 病假表 B01

  • 人员ID      姓名     病假天数    期间
    
  • nameid     name     bjts       YYMM
    
  • 101        张三       31       202301
    
  • 101        张三       28       202302
    
  • 101        张三       31       202303
    
  • 101        张三       30       202304
    
  • 101        张三       0        202305
    
  • 101        张三       0        202306
    
  • 102        李四       31       202301
    
  • 102        李四       28       202302
    
  • 102        李四       31       202303
    
  • 102        李四       25       202304
    
  • 102        李四       0        202305
    
  • 102        李四       0        202306
    
  • 103        王五       0        202301
    
  • 103        王五       15       202302
    
  • 103        王五       31       202303
    
  • 103        王五       30       202304
    
  • 103        王五       31       202305
    
  • 103        王五       30       202306
    

乍一看,我的第一反应就是 用TOP (计算周期) 来解决,每个人取 TOP计算周期里的病假合计, 大于医疗期就算超出了。

点击查看代码

  select nameid,SUM(bjts) AS BJHJ
 from 
 (
  select TOP (select  jszq from a01 where nameid=001) b01.yymm,b01.nameid,b01.bjts 
 from b01
 where b01.nameid=001
  ORDER BY b01.payym DESC
 ) topbj
 group by nameid

结果也很喜人

  • nameid  	BJHJ
    
  • 101	          61
    

这样结果和医疗期*30判断一下大小就可以了
然后尝试直接查所有数据 ,将以上语句中限制人员ID的去掉
结果报错,子查询返回的值不止一个,这个时候,我魔障了似的寻求TOP语句怎么解决这个问题,花费我半天时间。
最终确认是思路不太对啊,TOP不知道怎么按人分组(主要是我不会),我需要每个人的前N条。
重新整理思路,使用row_number ()

select 
	nameid ,name ,bjts,yymm,jszq
from		
	(select  
		row_number () over (partition by t.nameid order by t.yymm desc) rn , *
			from 
				(select a01.jszq,b01.*
					from a01,b01 
						where a01.nameid=b01.nameid
				) t
				
	) tt
where rn <=jszq
order by nameid desc

输出结果

  •   nameid	name	bjts	yymm	jszq
    
  •   103	    王五  	30	202306	6
    
  •   103	    王五  	31	202305	6
    
  •   103	    王五  	30	202304	6
    
  •   103	    王五  	31	202303	6
    
  •   103	    王五  	15	202302	6
    
  •   103	    王五  	0	202301	6
    
  •   102	    李四  	0	202306	5
    
  •   102	    李四  	0	202305	5
    
  •   102	    李四  	25	202304	5
    
  •   102	    李四  	31	202303	5
    
  •   102	    李四  	28	202302	5
    
  •   101	    张三  	0	202306	4
    
  •   101	    张三  	0	202305	4
    
  •   101	    张三  	30	202304	4
    
  •   101	    张三  	31	202303	4
    

至此,思路顺畅,然后前面再嵌套一些求和和比较大小的语句就不赘述了

总结 ,不能被下意识的反应左右,从多个角度考虑问题

标签:SQL,医疗期,分组,MS,王五,102,103,101,nameid
From: https://www.cnblogs.com/xinyidou/p/18330629

相关文章

  • 织梦DedeCMSv5.7安装初始化数据体验包失败的解决方法
    有些朋友在安装织梦DEDECMS程序时,安装初始化数据体验包失败,因为体验包数据比较大,网络不好的时候很容易失败,下面是一种比较保险的初始化数据体验包安装方法.1、先安装一个全新的DedeCMSv5.7GBK程序,安装时不要勾选安装初始化体验包.2、下载数据体验包(dedecmsv5.6与V5.7通......
  • MySQL忘记密码
    查看MySQL有没有启动。如果MySQL已经启动了,那么停掉MySQL:servicemysqldstop设置无密码启动在下面写上:skip-grant-tables启动MySQLservicemysqldstart无密码开启MySQL可以在里面设置密码。......
  • SqlSugar 多数据源的简单封装
    参考SqlSugar的官网文档,我自己封装了一个支持多数据库的UnitOfWork的SqlSugar封装类,直接使用SqlSugar的仓储操作如下:///<summary>///数据库实例基类///</summary>publicabstractclassBaseDbClient{///<summary>///获取数据库客户端实例......
  • [极客大挑战 2019]BabySQL
    [极客大挑战2019]BabySQL首先映入眼帘的是一个非常经典的登录界面![ctf]([极客大挑战2019]BabySQL.assets/ctf.png)我们先尝试判断一下这是什么注入点输入个1'看看怎么个事![image-20240729142647221]([极客大挑战2019]BabySQL.assets/image-20240729142647221.png)发现......
  • [GXYCTF2019]BabySQli
    [GXYCTF2019]BabySQli非常神奇的一道题,漏洞利用点在于联合查询时如果数据不存在,则会创建一个临时虚拟用户于是当前尝试username=admin,返回wrongpass则该用户名存在所以username:1'unionselect1,'admin','202cb962ac59075b964b07152d234b70'#(202cb962ac59075b964b07152......
  • MySQL 学习笔记 进阶(SQL优化,视图,存储过程 上)
    SQL优化 SQL优化-插入数据insert优化·批量插入insertintotb_uservalues(1,'Tom'),(2,'Cat'),(3,'Jerry');·手动提交事务starttransaction;insertintotb_uservalues(1,'Tom'),(2,'Cat'),(3,'Jerry......
  • GIS场景零代码拖拽式编辑,支持TMS/WMS/WMTS等多种GIS协议
    在三维GIS领域,编辑场景和处理影像数据通常是一个复杂且费时的过程,但现在有了山海鲸可视化,这一切都变得简单有趣。这款免费可视化工具为您提供了零代码拖拽式编辑的体验,让您无需编程知识就能轻松创建和优化GIS场景。通过直观的界面,您只需动动鼠标就能完成从场景编辑到效果添加的一......
  • [极客大挑战 2019]BabySQL
    [极客大挑战2019]BabySQL首先映入眼帘的是一个非常经典的登录界面我们先尝试判断一下这是什么注入点输入个1'看看怎么个事发现输入的1'被双引号包裹,再次输入1"显示密码不匹配,输入1'or1=1--+万能密码试试这里应该是过滤了or和+,用空格代替+尝试下大小写绕过不行,最后发......
  • java  mysql  数据库连接池,使用C3P0 的案例
    问:java mysql 数据库连接池,使用C3P0的案例答:当然有C3P0作为JavaMySQL数据库连接池的案例。C3P0是一个开源的JDBC连接池库,它具有连接池管理、连接池监控等功能,可以提高数据库连接的效率和性能。以下是使用C3P0连接MySQL数据库的一个案例:1.添加C3P0依赖首先,你需要在你......
  • MySQL大事务堵塞写入
    这是2022年发生的一起线上事故,现在有空记录一下。线上使用的是5.6版本的,大部分业务的逻辑都是先delete全表,再insert,所以大事务一直是个问题,但是未发生过阻塞业务的情况。现象MySQL服务器的负载在一分钟内急剧上升,后又迅速恢复正常。查看binlog文件发现当时有个3G的binlog文件......