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 中的日期比较的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 中的 Pivot - 根据日期时间列显示第一个和最后一个值