#tsql
#tsql
Вопрос:
Учитывая следующие данные:
StudentAbsences([StudentID], [DateAbsent], [reasonCode])
StudentDetails([Идентификатор студента], [Данные имена], [Фамилия], [Уровень года], [Дом])
Проблема: Я пытаюсь сгенерировать отчет для клиента, который хочет видеть более 3 лучших студентов, отсутствовавших в течение определенного периода. Этот период может быть любым — от последней недели до последнего месяца и до прошлого года. Мой текущий отчет дает им:
Student's Name (concatenation of GivenNames and Surname)
Unexplained (Number of Unexplained Absences during that particular period)
All Year to Date (The count of ALL the different types of Absence reasons for YTD)
Year Level (The student's Year Level)
Проблема в том, что теперь им также нужен столбец «Неделя до даты», но только для необъяснимых отсутствий. Это означает, что они хотят видеть количество отсутствий для каждого учащегося, начиная с понедельника этой конкретной недели.
Есть предложения?
Ответ №1:
Вот мой первый взгляд. Найдите 3 лучших студента, отсутствующих за неделю.
DECLARE @StartDate DateTime,
@EndDate DateTime
SELECT @StartDate=DATEADD(ww, DATEDIFF(ww,0,GETDATE()), 0), @EndDate=GetDate()
SELECT D.*
FROM StudentDetails D
INNER JOIN
(SELECT TOP 3 StudentID
FROM StudentAbsences
WHERE DateAbsent Between @StartDate and @EndDate
GROUP BY StudentID, CONVERT (nvarchar(10),DateAbsent, 102)
ORDER BY COUNT(CONVERT (nvarchar(10),DateAbsent, 102)) DESC) A ON A.StudentID = D.StudentID
Ответ №2:
Попробуйте…
DECLARE
@today datetime,
@monday datetime
SELECT
@today = CONVERT(varchar(10), GETDATE(), 101),
-- modulus is necessary, because report may be run on Sunday
@monday = DATEADD(day, -1 * ((DATEPART(weekday, @today) 5) % 7), @today)
SELECT @today, @monday
SELECT
SA.StudentId,
// OtherData...,
T.WeekToDate
FROM
StudentAbsences SA
INNER JOIN StudentDetails SD
ON SA.StudentId = SD.StudentId
CROSS APPLY
(
SELECT WeekToDate = COUNT(*)
FROM StudentAbsences
WHERE
Studentid = SA.StudentId
AND
DateAbsent >= @monday
AND
ReasonCode = 'Unexplained' -- substitute with actual unexplained code
) T