sql查询中的错误

时间:2010-01-20 08:04:34

标签: sql

我有这个问题:

(   SELECT 
        SUM(
            CONVERT(
                FLOAT, 
                CASE '01' 
                    WHEN '01' THEN 
                        CASE SIGN((sltr_tran_amt - ISNULL(sltr_matched_amt, 0)))
                            WHEN 1 THEN
                                CASE DBO.glas_aging_oth(CONVERT(DATETIME, '2009/04/04') - FLOOR(sltr_pstng_date))
                                    WHEN 0 THEN (sltr_tran_amt - ISNULL(sltr_matched_amt, 0))
                                    ELSE 0
                                END
                            ELSE 0
                        END
                    WHEN '02' THEN
                        CASE SIGN((sltr_tran_amt - ISNULL(sltr_matched_amt, 0)))
                            WHEN -1 THEN
                                CASE DBO.glas_aging_oth(CONVERT(DATETIME, '2009/04/04') - FLOOR(sltr_doc_date))
                                    WHEN 0 THEN (sltr_tran_amt - ISNULL(sltr_matched_amt, 0))
                                    ELSE 0
                                END
                            ELSE 0
                        END
                    END
            )
        ) 
    FROM
    WHERE
        CASE '01' 
            WHEN '01' THEN sltr_pstng_date
            ELSE sltr_doc_date
        END  = 
        CASE '01' 
            WHEN '01' THEN sltr_pstng_date
            ELSE sltr_doc_date
        END 
) thirty_days,
from glas_sl_transactions

当我执行此查询时,错误发生在'where'附近。我该如何避免这种情况?如果可能,请告诉我如何缩短此查询。

1 个答案:

答案 0 :(得分:2)

在该查询的中间某处,您有FROM WHERE - 即。你在FROM之后缺少一个表名。

此外,您可以通过删除所有CASE '1' WHEN '1' THEN位来缩短它,因为“1”始终为“1”。

编辑:好的,这是我的重新格式化:

(   SELECT 
        SUM(
            CONVERT(
                FLOAT, 
                CASE '01' 
                    WHEN '01' THEN 
                        CASE SIGN((sltr_tran_amt - ISNULL(sltr_matched_amt, 0)))
                            WHEN 1 THEN
                                CASE DBO.glas_aging_oth(CONVERT(DATETIME, '2009/04/04') - FLOOR(sltr_pstng_date))
                                    WHEN 0 THEN (sltr_tran_amt - ISNULL(sltr_matched_amt, 0))
                                    ELSE 0
                                END
                            ELSE 0
                        END
                    WHEN '02' THEN
                        CASE SIGN((sltr_tran_amt - ISNULL(sltr_matched_amt, 0)))
                            WHEN -1 THEN
                                CASE DBO.glas_aging_oth(CONVERT(DATETIME, '2009/04/04') - FLOOR(sltr_doc_date))
                                    WHEN 0 THEN (sltr_tran_amt - ISNULL(sltr_matched_amt, 0))
                                    ELSE 0
                                END
                            ELSE 0
                        END
                    END
            )
        ) 
    FROM
    WHERE
        CASE '01' 
            WHEN '01' THEN sltr_pstng_date
            ELSE sltr_doc_date
        END  = 
        CASE '01' 
            WHEN '01' THEN sltr_pstng_date
            ELSE sltr_doc_date
        END 
) thirty_days,
from glas_sl_transactions

因此,在END之上的第一个右括号之前,您似乎也错过了FROM。{/ p>

此外,它包含许多永远不会执行的代码。例如。

CASE '01' 
   WHEN '01' /* always executed */ 
   WHEN '02' /* never executed */ 
END

where子句也归结为1=1,因此可以删除。

总之,这就是我认为的样子。

SELECT SUM( CONVERT(
    FLOAT, 
    CASE SIGN((sltr_tran_amt - ISNULL(sltr_matched_amt, 0)))
        WHEN 1 THEN
            CASE DBO.glas_aging_oth(CONVERT(DATETIME, '2009/04/04') - FLOOR(sltr_pstng_date))
                WHEN 0 THEN (sltr_tran_amt - ISNULL(sltr_matched_amt, 0))
                ELSE 0
            END
        ELSE 0
    END
)) 
from glas_sl_transactions