vidya jobin Ответов: 3

Как принимать непрерывно 5 дней отсутствия в SQL


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

мой стол такой
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


мои данные в этой таблице таковы:
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	


Я ХОЧУ ПОСТОЯННО ОТСУТСТВОВАТЬ ДНИ СТУДЕНТА

Что я уже пробовал:

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

OriginalGriff

1) НЕ КРИЧИТЕ. Использование всех заглавных букв считается криком в интернете и грубостью (использование всех строчных букв считается ребячеством). Используйте правильную капитализацию, если хотите, чтобы вас воспринимали всерьез.
2) и? Что вы уже пробовали? Где * ты * застрял? какая помощь вам нужна?

RickZeeland

Вы понизили мой ответ, и я хотел бы знать, почему.

3 Ответов

Рейтинг:
19

Badal Kumar

Попробуйте ниже:

/*
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


Рейтинг:
0

RickZeeland

Это трудный вопрос, этот запрос не идеален, но может помочь вам начать работу:

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')


vidya jobin

я пробую этот код .НО Я НЕ ПОЛУЧАЮ ДОЛЖНОГО РЕЗУЛЬТАТА

ТЕПЕРЬ МОИ ТАБЛИЧНЫЕ ДАННЫЕ ВЫГЛЯДЯТ ТАК

3 1 1 FS001 2017-07-18 A 1 2017-07-18 1 2017-07-18 1
4 1 1 FS001 2017-07-18 A 1 2017-07-18 1 2017-07-18 1
5 1 1 FS001 2017-07-18 A 1 2017-07-18 1 2017-07-18 0
8 1 1 FS001 2017-08-01 A 1 2017-08-01 1 2017-08-01 1
9 1 1 FS001 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 A 1 2017-08-05 1 2017-08-01 1
13 1 1 FS002 2017-08-06 A 1 2017-08-05 1 2017-08-01 1
14 1 1 FS002 2017-08-07 A 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 1

Я ПОЛУЧАЮ ТАКОЙ ОТВЕТ

FS002 2017-08-03
FS002 2017-08-04

ТОГДА Я ПОПРОБУЮ ВАШУ ДОБЫЧУ ПЕРВЫЕ СТРОКИ

Выберите [RegNo], [Attdate]
От присутствия T1
Где [посещаемость] = 'A'
И СУЩЕСТВУЕТ
(Выберите [Attdate] из списка Attendence
Где DATEDIFF(d, [Attdate], T1. Attdate) = -1
И [отель] = Т1.[Королевство] и [посещаемость] = 'а')

ТОГДА Я ПОЛУЧАЮ
FS001 2017-08-01
FS002 2017-08-03
FS002 2017-08-04
FS002 2017-08-05
FS002 2017-08-06
FS002 2017-08-07

RickZeeland

Это верно, именно поэтому запрос еще не "идеален", он дает перекрывающиеся результаты. Кстати, я проверил его здесь: http://sqlfiddle.com/#!6 / 6fb3c/1

Karthik_Mahalingam

мои 5

Рейтинг:
0

RAMASWAMY EKAMBARAM

Я не знаком с Sql Server, но я тестировал в Oracle с минимальными столбцами и вашими данными. Я предполагаю, что студент посещает один курс, иначе запрос нужно будет изменить как "partition by regno, courseid".

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



Запрос:

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;



Выражение для 'numrecs' на самом деле не нужно, но я добавил его просто для того, чтобы перечислить количество записей после 'fromdate'