2010-01-20 4 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 и сделать его более читаемым, пожалуйста. –

+0

что такое ** точное сообщение об ошибке, которое вы получаете? –

ответ

2

Где-то глубоко в середине этого запроса у вас есть FROM WHERE - т.е. вам не хватает имени таблицы после FROM.

Кроме того, вы можете сделать это короче, удалив все биты CASE '1' WHEN '1' THEN, так как «1» всегда «1».

Edit: Хорошо, вот мой переформатирование его:

( 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.

Кроме того, в нем содержится много кода, который никогда не будет выполнен. Например.

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

где-пункт также сводится к 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 
Смежные вопросы