Сравнение дат в Pivot - PullRequest
       15

Сравнение дат в Pivot

1 голос
/ 06 сентября 2011

Я все еще работаю над тем, чтобы получить данные точно так, как я хочу, и они почти у цели - один последний вопрос.

Вот мой код:

      DECLARE @QA1 TABLE (SID varchar(7), FormID varchar(max), DateExam date, Present varchar(3))

      INSERT INTO @QA1 VALUES(1, 'Form1', '20110101', 'Yes')
      INSERT INTO @QA1 VALUES(2, 'Form1', '20110201', 'Yes')
      INSERT INTO @QA1 VALUES(3, 'Form1', '20110301', 'Yes')
      INSERT INTO @QA1 VALUES(4, 'Form1', '20110401', 'Yes')
      INSERT INTO @QA1 VALUES(5, 'Form1', '20110122', 'Yes')
      INSERT INTO @QA1 VALUES(1, 'Form2', '20110222', 'Yes')
      INSERT INTO @QA1 VALUES(2, 'Form2', '20110322', 'Yes')
      INSERT INTO @QA1 VALUES(3, 'Form2', '20110422', 'Yes')
      INSERT INTO @QA1 VALUES(1, 'Form3', '20110128', 'Yes')
      INSERT INTO @QA1 VALUES(1, 'Form4', '20110228', 'Yes')
      INSERT INTO @QA1 VALUES(5, 'Form5', '20110328', 'Yes')
      INSERT INTO @QA1 VALUES(5, 'Form6', '20111228', 'Yes')
      INSERT INTO @QA1 VALUES(4, 'Form2', '20111228', 'Yes')

      SELECT SID,
      ISNULL(MIN(CASE FormID WHEN 'Form1' THEN Present END), '') AS 'First Form',
      ISNULL(MIN(CASE FormID WHEN 'Form2' THEN isnull(CONVERT(varchar(12),DateExam,107),'') END), '')  as 'Date F2 Exam',
      ISNULL(MIN(CASE FormID WHEN 'Form2' THEN Present END), '') AS 'Second Form',
      ISNULL(MIN(CASE FormID WHEN 'Form4' THEN Present END), '') AS 'Fourth Form',
      ISNULL(MIN(CASE FormID WHEN 'Form5' THEN Present END), '') AS 'Fifth Form',
      ISNULL(MIN(CASE FormID WHEN 'Form6' THEN Present END), '') AS 'Sixth Form',

      ISNULL(MIN(CASE FormID WHEN 'Form3' THEN Present END), 

      MIN(CASE FormID WHEN 'Form2' THEN isnull(CONVERT(varchar(12),DateExam,107),'') END)

      ) AS 'Third Form'


      FROM @QA1


      GROUP BY SID
      ORDER BY SID

Это дает мнерезультат этого:

SID  First Form     Date F2 Exam     Second Form  Fourth Form  Fifth Form  Sixth Form  Third Form
1       Yes         Feb 22, 2011        Yes         Yes                                 Yes
2       Yes         Mar 22, 2011        Yes                                             Mar
3       Yes         Apr 22, 2011        Yes                                             Apr
4       Yes         Dec 28, 2011        Yes                                             Dec
5       Yes                                         Yes         Yes                     NULL

Что очень близко к тому, что я хочу, но я на самом деле хочу, чтобы столбец третьей формы был либо Да, либо Слишком, либо пустым ('') с просрочкой, определяемой каксегодня прошло более 34 дней после DateExam в Form2.

Последний оператор CASE успешно извлекает DateExam из Form2, но теперь мне нужно проверить, не просрочен ли он.Нужен ли мне другой CASE или вложенный if-then-else для добавления даты?Я знаю, что для добавления моих 34 дней мне нужен DATEADD (день 34, DateExam), и я проверю его по GETDATE (), но в какой форме должен быть оператор if-then-else внутри моего оператора CASE?

Спасибо

1 Ответ

0 голосов
/ 06 сентября 2011

Попробуйте изменить определение Third Form следующим образом:

COALESCE(
  MIN(CASE FormID WHEN 'Form3' THEN Present END), 
  CASE
    WHEN DATEDIFF(D, MIN(CASE FormID WHEN 'Form2' THEN DateExam END), GETDATE()) > 34
      THEN 'Overdue'
    ELSE ''
  END
) AS 'Third Form'
...