2010-01-20 9 views
-3

J'ai cette requête:requête 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 

Quand j'exécute cette requête, une erreur est ocurring près « où ». Comment puis-je éviter cela? Si possible, dites-moi aussi comment raccourcir cette requête.

+1

formater le sql et le rendre plus lisible s'il vous plaît. –

+0

quel est le message d'erreur ** exact ** que vous obtenez ?? –

Répondre

2

Quelque part au milieu de cette requête, vous avez FROM WHERE - ie. il vous manque un nom de table après le FROM.

En outre, vous pouvez le rendre plus court en supprimant tous les bits CASE '1' WHEN '1' THEN, puisque '1' est toujours '1'.

Edit: Ok, voici mon reformatage de celui-ci:

( 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 

Il semble donc que vous manque aussi un END dans cet écart avant la première tranche de fermeture au-dessus du FROM.

En outre, il contient beaucoup de code qui ne sera jamais exécuté. Par exemple.

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

La clause where revient également vers le bas pour 1=1, et peut donc être retiré. En conclusion, voici ce que je pense que cela devrait ressembler.

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