我在创建SQL查询时遇到了一些问题。
我有一个包含4列'Enquiry Date' , 'Taken Date' , 'Indication Date' , 'Cancelled Date'
的表,该表名为tbl_Sales
。
我想要做的是创建一个t-sql,看看4列,而GETDATE()
的最近日期是当前状态。
因此,例如,如果该行在每列中都有一个日期,并且填写的最后一个日期是昨天在'Cancelled Date'
中说明的话,则该行的状态应显示为canceled
。
是否可以这样做?
答案 0 :(得分:2)
如果您没有某个状态字段,那么您的设计会有些糟糕。这是强力解决方案:
SELECT *,
CASE WHEN [Cancelled Date] IS NOT NULL AND
([Cancelled Date] > [Indication Date] OR [Indication Date] IS NULL) AND
([Cancelled Date] > [Taken Date] OR [Taken Date] IS NULL) AND
([Cancelled Date] > [Enquiry Date] OR [Enquiry Date] IS NULL) THEN 'Canceled'
WHEN [Indication Date] IS NOT NULL AND
([Indication Date] > [Cancelled Date] OR [Cancelled Date] IS NULL) AND
([Indication Date] > [Taken Date] OR [Taken Date] IS NULL) AND
([Indication Date] > [Enquiry Date] OR [Enquiry Date] IS NULL) THEN 'Indication'
WHEN [Taken Date] IS NOT NULL AND
([Taken Date] > [Indication Date] OR [Indication Date] IS NULL) AND
([Taken Date] > [Cancelled Date] OR [Cancelled Date] IS NULL) AND
([Taken Date] > [Enquiry Date] OR [Enquiry Date] IS NULL) THEN 'Taken'
WHEN [Enquiry Date] IS NOT NULL AND
([Enquiry Date] > [Indication Date] OR [Indication Date] IS NULL) AND
([Enquiry Date] > [Taken Date] OR [Taken Date] IS NULL) AND
([Enquiry Date] > [Cancelled Date] OR [Cancelled Date] IS NULL) THEN 'Enquiry'
END
FROM Sales
修改强>
以下是一些缩短版本:
SELECT *
FROM Sales
CROSS APPLY ( SELECT TOP 1
st
FROM ( VALUES ( [Enquiry Date], 'Enquiry'),
( [Taken Date], 'Taken'),
( [Indication Date], 'Indication'),
( [Cancelled Date], 'Canceled') ) d ( dt, st )
ORDER BY dt DESC
) ca