Pivot 中的日期比较

Posted

技术标签:

【中文标题】Pivot 中的日期比较【英文标题】:Date compare within Pivot 【发布时间】:2011-09-06 04:06:11 【问题描述】:

我仍在努力按我想要的方式获取数据,并且它几乎就在那里 - 最后一个问题。

这是我的代码:

      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(day 34, DateExam) 并且我会对照 GETDATE() 检查它,但是 if-then-else 语句应该在我的 CASE 语句中以什么形式出现?

谢谢

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于Pivot 中的日期比较的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle SQL 中按报告日期的 PIVOT 值

将数据框列中的日期与单个日期进行比较

如何比较 Postgresql 中日期时间字段中的日期?

MySQL 中的 Pivot - 根据日期时间列显示第一个和最后一个值

如何将 Fullcalendar 插件中的日期与日期数组进行比较

如何比较 Django 模板中的日期