Фильтр данных за неделю до даты

#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