如何在SQL中连续缺席5天 [英] How to take 5 continuously absent days in SQL
本文介绍了如何在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屋!
查看全文