2010-01-20 118 views
-3

我有這個疑問:錯誤在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 

當我執行此查詢,錯誤是ocurring接近「其中」。我如何避免這種情況?如果可能的話,請告訴我如何縮短這個查詢。

+1

格式化sql並使其更具可讀性。 – 2010-01-20 08:12:13

+0

什麼是你正在得到的**精確**錯誤信息? – 2010-01-20 08:44:25

回答

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 

所以看起來你也是第一個右括號的FROM以上之前缺少這一差距的END

此外,它包含許多永遠不會執行的代碼。例如。

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