SQL循环检查

时间:2015-06-16 09:46:30

标签: sql sql-server tsql case

我在创建SQL查询时遇到了一些问题。 我有一个包含4列'Enquiry Date' , 'Taken Date' , 'Indication Date' , 'Cancelled Date'的表,该表名为tbl_Sales

我想要做的是创建一个t-sql,看看4列,而GETDATE()的最近日期是当前状态。

因此,例如,如果该行在每列中都有一个日期,并且填写的最后一个日期是昨天在'Cancelled Date'中说明的话,则该行的状态应显示为canceled

是否可以这样做?

1 个答案:

答案 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