将Excel公式转换为SQL Case

时间:2013-11-15 14:51:27

标签: sql sql-server excel

早上好,我需要一些重要的帮助。

我必须将EXCEL公式转换为SQL案例。 当我到达最后一节时,整个事情一直在崩溃。我不能为我的生活弄清楚如何正确地设置它,而且我厌倦了被踢到黑头上。

我的主要问题是excel如何处理其If / then's的多个“Else”药水

这是Excel:

=IF(AND(W7+H7<=0,IF(E7-H7-S7>0,E7-H7-S7,0)<=0),0,IF(W7+H7<IF(E7-H7-S7>0,E7-H7-S7,0),IF(W7+H7<0,0,W7+H7),IF(E7-H7-S7>0,IF(W7>H7,E7-S7,H7+AF7),H7)))

以下是相关章节以及它们到目前为止如何转换为SQL。

E4 = TotInChar.TotInChar
H4 = CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2))
W4 = CAST(tmpdc.[14]AS decimal(10,2))
S4 = T4MathBlock.TTIV
AF4 = [AmountIncluded].[Amount]

这是我到目前为止所做的SQL案例: (它被设计成外部应用的一部分,因为我在他们自己的外部应用中处理所有数学部分。这样,任何跟在我后面的人都会发现代码被分段并正确记录)

SELECT (CASE 
    WHEN CAST(tmpdc1.[14]AS decimal(10,2))+(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2))) <= 0
                AND (CASE WHEN(TotInChar.TotInChar -(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))- T4MathBlock.TTIV) >0 
                        THEN TotInChar.TotInChar -(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))- T4MathBlock.TTIV
            ELSE '0.00' END) <=0 THEN '0.00'
    /* part 2*/     
    WHEN CAST(tmpdc1.[14] AS decimal(10,2))+(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))
                < 
            (CASE WHEN (TotInChar.TotInChar -(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))- T4MathBlock.TTIV)
                 > 0 
            THEN TotInChar.TotInChar -(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))- T4MathBlock.TTIV
                ELSE '0.00' 
            END)
            THEN (TotInChar.TotInChar -(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))- T4MathBlock.TTIV)
    /*Part 3*/

    WHEN CAST(tmpdc.[14]AS decimal(10,2))+CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2)) 
            < 0 THEN '0.00' 
        ELSE (CAST(tmpdc.[14]AS decimal(10,2))+CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2)))
    /*Part 4*/                                      

    WHEN TotInChar.TotInChar -(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))- T4MathBlock.TTIV
             > 0  THEN
                 (CASE(CAST(tmpdc.[14]AS decimal(10,2)) > CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2))
                    THEN TotInChar.TotInChar - T4MathBlock.TTIV ELSE '0.00')
        ELSE CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2)))
    End 



End) AS[ANT4]
 From #TempDisclosure tmpdc1 
                     WHERE tmpdc1.[Number] = Tmpdc.[Number]

感谢您对此给予的任何帮助,我现在已经工作了大约10个小时,我的大脑只是疼了

3 个答案:

答案 0 :(得分:0)

简化它。 假设所有都是整数,形成CASE。铸造的细节应该在以后进行。 目前,您所拥有的解决方案非常混乱,无法验证它是否与Excel公式匹配。

答案 1 :(得分:0)

快速匹配显示最后一节可能有错误...

你有这个:

WHEN TotInChar.TotInChar -(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))- T4MathBlock.TTIV
         > 0  THEN
             (CASE(CAST(tmpdc.[14]AS decimal(10,2)) > CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2))
                THEN TotInChar.TotInChar - T4MathBlock.TTIV ELSE '0.00')
    ELSE CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2)))
End 

试试这个:

WHEN TotInChar.TotInChar -(CAST(tmpdc1.[3]AS Decimal (10,2)) + CAST(tmpdc1.[5]AS Decimal (10,2)))- T4MathBlock.TTIV
         > 0  THEN
             (CASE(CAST(tmpdc.[14]AS decimal(10,2)) > CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2)))
                THEN TotInChar.TotInChar - T4MathBlock.TTIV ELSE '0.00'
    ELSE CAST(tmpdc.[3]AS Decimal (10,2)) + CAST(tmpdc.[5]AS Decimal (10,2)))
End 

答案 2 :(得分:0)

这是我用来分解它的一些伪代码。

DECLARE a int;
DECLARE b int;

SET a = (W7 + H7);
SET b = (E7 - H7 - S7);

IF (b < 0) THEN b = 0;

IF (a <= 0 AND b <= 0) THEN BEGIN
    0
END ELSE BEGIN
    IF (a < b) THEN BEGIN
        IF (a < 0) THEN BEGIN
            0
        END ELSE BEGIN
            a
        END
    END ELSE BEGIN
        IF (b > 0) THEN BEGIN
            IF (W7 > H7) THEN BEGIN
                E7 - S7
            END ELSE BEGIN
                H7 + AF7
            END
        END ELSE BEGIN
            H7
        END
    END
END