Pivot中的日期比较

时间:2011-09-06 04:06:11

标签: sql sql-server pivot case

我仍在努力将数据完全按照我想要的方式输出,而且几乎就在那里 - 最后一个问题。

这是我的代码:

      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

这与我想要的非常接近,但我实际上希望第三表格列是“是”,“过期”或“空白”(''),其中定义的逾期,如果今天超过Form2的DateExam超过34天

最后一个CASE语句成功从Form2中提取DateExam,但现在我需要检查它是否过期。我是否需要另一个CASE或嵌套if-then-else来添加日期?我知道要添加我的34天我需要DATEADD(第34天,DateExam),我将根据GETDATE()检查它,但是if-then-else语句应该在我的CASE语句中使用什么形式?

谢谢

1 个答案:

答案 0 :(得分:0)

尝试更改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'