Фильтр данных за неделю до даты - PullRequest
2 голосов
/ 29 апреля 2011

Дано следующие данные:

StudentAbsences ([StudentID], [DateAbsent], [ReasonCode])

StudentDetails ([StudentID], [GivenNames], [Фамилия], [YearLevel], [дом])

Проблема: Я пытаюсь сгенерировать отчет для клиента, который хочет увидеть лучших 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)

Беда в том, что теперь им нужен столбец «Неделя до даты», но только для необъяснимых пропусков. Это означает, что они хотят видеть количество пропусков для каждого учащегося, начиная с понедельника этой конкретной недели.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2011

Попробуйте ...

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
0 голосов
/ 30 апреля 2011

Вот мой первый дубль.Получите трех лучших учеников, пропавших без вести за неделю.

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...