如何在SQL中连续缺席5天 [英] How to take 5 continuously absent days in SQL

查看:116
本文介绍了如何在SQL中连续缺席5天的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在sql server 2008中连续缺席5天r2 



这样我的桌子

 attid int未选中
CourseId int未选中
CourseCatID int未选中
RegNo nvarchar(7)未选中
Attdate date未选中
出勤时间char(1)未选中
createUser int未选中
createdDate date未选中
updatedUser int未选中
updatedDate date未选中
statuse int未选中





我的数据在这个表中:

 3 1 1 FS001 2017-07-18 A 1 2017-07-18 1 2017-07-18 1 
4 1 1 FS002 2017-07-18 P 1 2017-07-18 1 2017-07-18 1
5 1 1 FS002 2017-07-18 A 1 2017-07-18 1 2017- 07-18 0
8 1 1 FS002 2017-08-01 A 1 2017-08-01 1 2017-08-01 1
9 1 1 FS002 2017-08-02 A 1 2017-08- 02 1 2017-08-01 1
10 1 1 FS002 2017-08-03 A 1 2017-08-03 1 2017-08-01 1
11 1 1 FS002 2017-08-04 A 1 2017-08-04 1 2017-08-01 1
12 1 1 FS002 2017-08-05 p 1 2017-08-05 1 2017-08-01 1
13 1 1 FS 002 2017-08-06第1页2017-08-05 1 2017-08-01 1
14 1 1 FS002 2017-08-07 p 1 2017-08-05 1 2017-08-01 1
15 1 1 FS002 2017-08-08 A 1 2017-08-05 1 2017-08-01





我想要连续不断学生的日子



我的尝试:



如何在sql server 2008中连续缺席5天r2 

解决方案

这很难,这个查询并不完美,但可能会让你开始:

  SELECT  [RegNo],[Attdate] 
< span class =code-keyword> FROM Attendence T1
WHERE [出勤率] = ' A'
AND NOT EXISTS
SELECT [Attdate] FR om Attendence
WHERE DATEDIFF(d,[Attdate],T1.Attdate) BETWEEN 1 AND 4
AND [RegNo] = T1。[RegNo] AND [出勤率] = ' A'
AND EXISTS
SELECT [Attdate] 来自 Attendence
WHERE DATEDIFF(d,[Attdate],T1.Attdate) BETWEEN -4 AND -1
AND [RegNo] = T1。[RegNo] AND [出勤率] = ' A'


尝试以下:



 / * 
删除表Attendence

创建表格Attendence(attid int,
CourseId int,
CourseCatID int,
RegNo nvarchar(7),
Attdate date,
出勤char(1),
createUser int,
createdDate date,
updatedUser int,
updatedDate date,
statuse int)




插入Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse)值(1,1,1,'FS001', '2017-07-18','A',1,'2017-07-18',1,'2017-07-18',1)
插入Attendence(attid,CourseId,CourseCatID,RegNo, Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse)values(2,1,1,'FS002','2017-07-18','P',1,'2017-07-18',1, '2017-07-18',1)
插入Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statu se)值(3,1,1,'FS002','2017-07-19','A',1,'2017-07-18',1,'2017-07-18',0)
插入Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse)值(4,1,1,'FS002','2017-08-01','A ',1,'2017-08-01',1,'2017-08-01',1)
插入Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser, updatedDate,statuse)values(5,1,1,'FS002','2017-08-02','A',1,'2017-08-02',1,'2017-08-01',1)
插入Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse)值(6,1,1,'FS002','2017-08-03', 'A',1,'2017-08-03',1,'2017-08-01',1)
插入Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate, updatedUser,updatedDate,statuse)values(7,1,1,'FS002','2017-08-04 ,'A',1,'2017-08-04',1,'2017-08-01',1)
插入Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate ,updatedUser,updatedDate,statuse)values(8,1,1,'FS002','2017-08-05','p',1,'2017-08-05',1,'2017-08-01' ,1)
插入Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse)值(9,1,1,'FS002','2017-08- 06','p',1,'2017-08-05',1,'2017-08-01',1)
插入Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser ,createdDate,updatedUser,updatedDate,statuse)values(10,1,1,'FS002','2017-08-07','p',1,'2017-08-05',1,'2017-08- 01',1)
插入Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse)值(11,1,1,'FS002','2017- 08-08' , 'A',1 '2017年8月5日',1,2017-0 8-01',0)

* /


将@LeaveAttendence声明为表(Id int identity(1,1),RegNo nvarchar(7), LeaveStartDate Date,LeaveEndDate Date,ContinuousLeave int)




声明@incrementCount int
声明@totalCount int


从Attendence选择@totalCount = Count(*)
从Attendence选择@incrementCount = Min(attid)

声明@RegNo nvarchar(7),@ LeaveStartDate Date,@ LeaveEndDate Date ,@ Attendance char(1)

而@incrementCount< @totalCount
开始

选择@RegNo = RegNo,@ LeaveStartDate = Attdate,@ LeaveEndDate = Attdate,@ Attendance =出席attendence attid = @incrementCount

如果不存在(从@LeaveAttendence中选择1,其中@RegNo = RegNo和ContinuousLeave< 5)
开始
插入@LeaveAttendence(RegNo,LeaveStartDate,LeaveEndDate,ContinuousLeave)值(@ RegNo,null,null ,0)
结束


如果@Attendance ='A'
开始

打印演员(@RegNo as varchar)+' - '+ Cast(@LeaveEndDate as varchar)

如果存在(从@LeaveAttendence中选择1,其中@RegNo = RegNo和ContinuousLeave> 0)
开始
更新@LeaveAttendence集LeaveEndDate = @ LeaveEndDate,ContinuousLeave = ContinuousLeave + 1其中@RegNo = RegNo和ContinuousLeave< 5
结束
否则
开始
更新@LeaveAttendence设置LeaveStartDate = @LeaveStartDate,LeaveEndDate = @ LeaveEndDate,ContinuousLeave = 1其中@RegNo = RegNo和ContinuousLeave< 5
结束
结束
否则
开始
更新@LeaveAttendence设置LeaveStartDate = null,LeaveEndDate = null,ContinuousLeave = 0其中@RegNo = RegNo和ContinuousLeave< 5
结束

SET @incrementCount = @incrementCount + 1
END

从@LeaveAttendence中选择*其中ContinuousLeave> 4


我不熟悉Sql Server,但我在Oracle中使用最少的列和数据进行了测试。我假设学生参加单一课程,否则查询将需要修改为按照regno,courseid分区。



创建table courseattend 

regno varchar2(5)not null,
attdate date not null,
attendance char(1)not null

;

 





查询:




选择regno,fromdate,untildate

select regno,attdate fromdate,
max(attdate)over
(按当前行和4之间的attdate行按照regno顺序划分)untildate,
总和(当'A'然后1其他0结束时的情况出勤)超过
(按照regno order by分区attdate当前行和4之间的行(以下)absentcount,
sum(1)超过
(按当前行和4之间的attdate行的regno顺序分区)numrecs
from courseattend

其中absentcount = 5
顺序为1,2;

 





'numrecs'的表达式并不是真的需要,但我添加了只是列出了之后的记录数'没有fromdate'


how to take 5 continuously absent days in sql server 2008 r2


my table like this

attid	int	Unchecked
CourseId	int	Unchecked
CourseCatID	int	Unchecked
RegNo	nvarchar(7)	Unchecked
Attdate	date	Unchecked
Attendance	char(1)	Unchecked
createUser	int	Unchecked
createdDate	date	Unchecked
updatedUser	int	Unchecked
updatedDate	date	Unchecked
statuse	int	Unchecked



my data IN THIS TABLE ARE:

3	1	1	FS001	2017-07-18	A	1	2017-07-18	1	2017-07-18	1
4	1	1	FS002	2017-07-18	P	1	2017-07-18	1	2017-07-18	1
5	1	1	FS002	2017-07-18	A	1	2017-07-18	1	2017-07-18	0
8	1	1	FS002	2017-08-01	A	1	2017-08-01	1	2017-08-01	1
9	1	1	FS002	2017-08-02	A	1	2017-08-02	1	2017-08-01	1
10	1	1	FS002	2017-08-03	A	1	2017-08-03	1	2017-08-01	1
11	1	1	FS002	2017-08-04	A	1	2017-08-04	1	2017-08-01	1
12	1	1	FS002	2017-08-05	p	1	2017-08-05	1	2017-08-01	1
13	1	1	FS002	2017-08-06	p	1	2017-08-05	1	2017-08-01	1
14	1	1	FS002	2017-08-07	p	1	2017-08-05	1	2017-08-01	1
15	1	1	FS002	2017-08-08	A	1	2017-08-05	1	2017-08-01	



I WANT CONTINUOUSLY ABSENT DAYS OF A STUDENT

What I have tried:

how to take 5 continuously absent days in sql server 2008 r2

解决方案

That's a difficult one, this query is not perfect, but might get you started:

SELECT [RegNo], [Attdate]
FROM Attendence T1
WHERE [Attendance] = 'A'
AND NOT EXISTS 
  (SELECT [Attdate] from Attendence 
   WHERE DATEDIFF(d, [Attdate], T1.Attdate) BETWEEN 1 AND 4 
   AND [RegNo] = T1.[RegNo] AND [Attendance] = 'A')
AND EXISTS 
  (SELECT [Attdate] from Attendence 
   WHERE DATEDIFF(d, [Attdate], T1.Attdate) BETWEEN -4 AND -1
   AND [RegNo] = T1.[RegNo] AND [Attendance] = 'A')


Try below:

/*
Drop table Attendence

Create table Attendence(attid	int,
CourseId	int,
CourseCatID	int,
RegNo	nvarchar(7),
Attdate	date,
Attendance	char(1),
createUser	int,
createdDate	date,
updatedUser	int,
updatedDate	date,
statuse	int)




Insert into Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse) values (1	,1	,1	,'FS001',	'2017-07-18',	'A',	1,	'2017-07-18',	1,	'2017-07-18',	1)
Insert into Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse) values (2	,1	,1	,'FS002',	'2017-07-18',	'P',	1,	'2017-07-18',	1,	'2017-07-18',	1)
Insert into Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse) values (3	,1	,1	,'FS002',	'2017-07-19',	'A',	1,	'2017-07-18',	1,	'2017-07-18',	0)
Insert into Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse) values (4	,1	,1	,'FS002',	'2017-08-01',	'A',	1,	'2017-08-01',	1,	'2017-08-01',	1)
Insert into Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse) values (5	,1	,1	,'FS002',	'2017-08-02',	'A',	1,	'2017-08-02',	1,	'2017-08-01',	1)
Insert into Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse) values (6	,1	,1	,'FS002',	'2017-08-03',	'A',	1,	'2017-08-03',	1,	'2017-08-01',	1)
Insert into Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse) values (7	,1	,1	,'FS002',	'2017-08-04',	'A',	1,	'2017-08-04',	1,	'2017-08-01',	1)
Insert into Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse) values (8	,1	,1	,'FS002',	'2017-08-05',	'p',	1,	'2017-08-05',	1,	'2017-08-01',	1)
Insert into Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse) values (9	,1	,1	,'FS002',	'2017-08-06',	'p',	1,	'2017-08-05',	1,	'2017-08-01',	1)
Insert into Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse) values (10	,1	,1	,'FS002',	'2017-08-07',	'p',	1,	'2017-08-05',	1,	'2017-08-01',	1)
Insert into Attendence(attid,CourseId,CourseCatID,RegNo,Attdate,Attendance,createUser,createdDate,updatedUser,updatedDate,statuse) values (11	,1	,1	,'FS002',	'2017-08-08',	'A',	1,	'2017-08-05',	1,	'2017-08-01',	0)

*/


Declare @LeaveAttendence as table(Id int identity(1,1), RegNo nvarchar(7), LeaveStartDate Date, LeaveEndDate Date, ContinuousLeave int)




Declare @incrementCount int
Declare @totalCount int


Select @totalCount = Count(*) from Attendence
Select @incrementCount = Min(attid) from Attendence

Declare @RegNo nvarchar(7), @LeaveStartDate Date, @LeaveEndDate Date, @Attendance char(1)

while @incrementCount < @totalCount
Begin

Select @RegNo = RegNo, @LeaveStartDate = Attdate, @LeaveEndDate = Attdate, @Attendance = Attendance from Attendence where attid = @incrementCount

If Not Exists(Select 1 from @LeaveAttendence where @RegNo = RegNo AND ContinuousLeave < 5)
Begin
	Insert into @LeaveAttendence(RegNo,LeaveStartDate,LeaveEndDate,ContinuousLeave) values (@RegNo,null,null,0)
End


if @Attendance = 'A' 
Begin

  print Cast(@RegNo as varchar) + ' - ' + Cast(@LeaveEndDate as varchar) 

	If Exists(Select 1 from @LeaveAttendence where @RegNo = RegNo AND ContinuousLeave > 0)
	Begin
		Update @LeaveAttendence set LeaveEndDate = @LeaveEndDate,ContinuousLeave = ContinuousLeave + 1 where @RegNo = RegNo and ContinuousLeave < 5
	End
	Else
	Begin
		Update @LeaveAttendence set LeaveStartDate = @LeaveStartDate, LeaveEndDate = @LeaveEndDate,ContinuousLeave = 1 where @RegNo = RegNo and ContinuousLeave < 5
	End
End
Else
Begin
	Update @LeaveAttendence set LeaveStartDate = null, LeaveEndDate = null,ContinuousLeave = 0 where @RegNo = RegNo and ContinuousLeave < 5
End

SET @incrementCount = @incrementCount + 1
END

Select * from @LeaveAttendence where ContinuousLeave > 4


I am not familiar with Sql Server but I have tested in Oracle with the minimum columns and your data. I am assuming that a student attends a single course else the query will need to be modified as 'partition by regno, courseid'.

create table courseattend
(
regno            varchar2(5) not null,
attdate          date not null,
attendance       char(1) not null
)
;



Query:

select regno, fromdate, tilldate
from
(
select regno, attdate fromdate, 
max(attdate) over 
	(partition by regno order by attdate rows between current row and 4 following) tilldate,
sum(case attendance when 'A' then 1 else 0 end) over 
	(partition by regno order by attdate rows between current row and 4 following) absentcount,
sum(1) over 
	(partition by regno order by attdate rows between current row and 4 following) numrecs
from courseattend
)
where absentcount = 5
order by 1, 2;



The expression for 'numrecs' is not really needed but I have added just to list the number of records after 'fromdate'


这篇关于如何在SQL中连续缺席5天的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆