复杂的CASE表达代码

问题描述 投票:0回答:2

我有一个我需要修改的现有案例陈述,它给了我一些麻烦。现有代码:

CASE WHEN (DATEDIFF(Day, MAX(ContDataTranDate), ContDataEnd) + 1)
-(DATEDIFF(wk, MAX(ContDataTranDate), ContDataEnd) * 2)  
-(CASE WHEN DATENAME(dw, MAX(ContDataTranDate)) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, ContDataEnd) = 'Saturday' THEN 1 ELSE 0 END) -1  = 1 THEN 1 ELSE 0 END [Shipped1Day]   

我需要补充的内容: 我有2个新列,SOFReleaseDateNameSOFReleaseDateValue。 我需要更改现有的声明,说当SOFReleaseDateName不为null时,在当前使用SOFReleaseDateValue ELSE的计算中使用ContDataTranDate而不是ContDataTranDate使用ContDataTranDate。我尝试了很多不同的方法。 SOFReleaseDateValue也是一个日期。

sql sql-server
2个回答
0
投票
CASE WHEN (DATEDIFF(Day, MAX(case when SOFReleaseDateName is not null then SOFReleaseDateValue else ContDataTranDate end), ContDataEnd) + 1)
-(DATEDIFF(wk, MAX(case when SOFReleaseDateName is not null then SOFReleaseDateValue else ContDataTranDate end), ContDataEnd) * 2)  
-(CASE WHEN DATENAME(dw, MAX(case when SOFReleaseDateName is not null then SOFReleaseDateValue else ContDataTranDate end)) = 'Sunday' THEN 1 ELSE 0 END)
-(CASE WHEN DATENAME(dw, ContDataEnd) = 'Saturday' THEN 1 ELSE 0 END) -1  = 1 THEN 1 ELSE 0 END [Shipped1Day]

0
投票

只需在您检查SOFReleaseDateName的前面添加一个新的case语句

CASE WHEN SOFReleaseDateName IS NOT NULL THEN
   CASE WHEN (DATEDIFF(Day, MAX(SOFReleaseDateValue ), ContDataEnd) + 1)
            -(DATEDIFF(wk, MAX(SOFReleaseDateValue ), ContDataEnd) * 2)  
            -(CASE WHEN DATENAME(dw, MAX(SOFReleaseDateValue )) = 'Sunday' THEN 1 ELSE 0 END)
            -(CASE WHEN DATENAME(dw, ContDataEnd) = 'Saturday' THEN 1 ELSE 0 END) -1  = 1 
        THEN 1 
        ELSE 0
    END
WHEN
    (DATEDIFF(Day, MAX(ContDataTranDate), ContDataEnd) + 1)
    -(DATEDIFF(wk, MAX(ContDataTranDate), ContDataEnd) * 2)  
    -(CASE WHEN DATENAME(dw, MAX(ContDataTranDate)) = 'Sunday' THEN 1 ELSE 0 END)
    -(CASE WHEN DATENAME(dw, ContDataEnd) = 'Saturday' THEN 1 ELSE 0 END) -1  = 1 

    THEN 1 
    ELSE 0 
END [Shipped1Day] 

SOFReleaseDateName IS NOT NULL案件之后你可能需要ELSE而不是WHEN

CASE WHEN SOFReleaseDateName IS NOT NULL THEN
    CASE WHEN (DATEDIFF(Day, MAX(SOFReleaseDateValue ), ContDataEnd) + 1)
            -(DATEDIFF(wk, MAX(SOFReleaseDateValue ), ContDataEnd) * 2)  
            -(CASE WHEN DATENAME(dw, MAX(SOFReleaseDateValue )) = 'Sunday' THEN 1 ELSE 0 END)
            -(CASE WHEN DATENAME(dw, ContDataEnd) = 'Saturday' THEN 1 ELSE 0 END) -1  = 1 
        THEN 1 
        ELSE 0
    END
ELSE
     CASE WHEN (DATEDIFF(Day, MAX(ContDataTranDate), ContDataEnd) + 1)
            -(DATEDIFF(wk, MAX(ContDataTranDate), ContDataEnd) * 2)  
            -(CASE WHEN DATENAME(dw, MAX(ContDataTranDate)) = 'Sunday' THEN 1 ELSE 0 END)
            -(CASE WHEN DATENAME(dw, ContDataEnd) = 'Saturday' THEN 1 ELSE 0 END) -1  = 1 
        THEN 1 
        ELSE 0 
    END
END [Shipped1Day]  
© www.soinside.com 2019 - 2024. All rights reserved.