2009-08-31 3 views
-1

Quelqu'un peut-il nous faire savoir un moyen plus facile d'obtenir le résultat comme indiqué par la requête suivante? Nous devons trouver un moyen qui peut nous montrer le même résultat que la requête suivante:moyen plus facile d'obtenir le résultat comme indiqué par la requête SQL suivante (base de données Oracle)

SELECT DISTINCT A.bio_id , 
    DECODE(A.wk_units2 - B.wk_units1,0,NULL,A.wk_units2) prev, 
    DECODE(A.wk_units2 - B.wk_units1,0,NULL,B.wk_units1) curr, 
    DECODE(A.wk_units3 -B.wk_units2,0,NULL,A.wk_units3) prev, 
    DECODE(A.wk_units3 -B.wk_units2,0,NULL,B.wk_units2) curr, 
    DECODE(A.wk_units4 -B.wk_units3,0,NULL,A.wk_units4) prev, 
    DECODE(A.wk_units4 -B.wk_units3,0,NULL,B.wk_units3) curr, 
    DECODE(A.wk_units5 -B.wk_units4,0,NULL,A.wk_units5) prev, 
    DECODE(A.wk_units5 -B.wk_units4,0,NULL,B.wk_units4) curr, 
    DECODE(A.wk_units6 -B.wk_units5,0,NULL,A.wk_units6) prev, 
    DECODE(A.wk_units6 -B.wk_units5,0,NULL,B.wk_units5) curr 
    .           . 
    .           . 
    .           . 
    DECODE(A.wk_units105 -B.wk_units104,0,NULL,A.wk_units105) prev, 
    DECODE(A.wk_units105 -B.wk_units105,0,NULL,B.wk_units104) curr 



    FROM 
    cnt_sls_dm.fct_sales_summary A, 
    cnt_sls_dm.fct_sales_summary B 
    WHERE 
    A.bio_id=B.bio_id AND A.bio_id<>0 
    AND ROWNUM<25 
    AND (A.wk_units2<> B.wk_units1 
    OR A.wk_units3<> B.wk_units2 
    OR A.wk_units4<> B.wk_units3 
    OR A.wk_units5<> B.wk_units4 
    OR A.wk_units6<> B.wk_units5 
    .      . 
    .      . 
    .      . 
    OR A.wk_units105<>B.wk_units104) 

La sortie est comme:

BIO_ID PREV CURR PREV_1 CURR_1 PREV_2 CURR_2 PREV_3 CURR_3 
5,032,130.00 -1 0 0 1   0 1 
5,032,130.00 1 0 0 1 1 0 0 1 
5,032,130.00   0 1   0 1 
5,032,130.00   10 1 10 0 0 1 
5,032,328.00 53 0 36 0 20 0  
5,032,328.00       1 0 
5,175,147.00 2 0      
5,175,147.00   2 0    
5,175,147.00         
21,073,129.00 17 0     2 0 
21,073,129.00 18 0 6 0 2 0  
21,073,129.00       1 0 
21,073,129.00       3 0 
21,073,129.00 
+1

Quelle version d'Oracle utilisez-vous? – David

+0

@Irveen; Vous devez fournir des commentaires si la solution proposée fonctionne/pour répondre à des questions supplémentaires. – tuergeist

+0

@Irveen: que voulez-vous dire par "plus facile"? Si vous souhaitez que nous réécrivions la requête, vous devez décrire les règles de génération du résultat et fournir une explication pour la table dénormalisée méchamment. – APC

Répondre

1

Je changerais la partie

AND (A.wk_units2<> B.wk_units1 
OR A.wk_units3<> B.wk_units2 
OR A.wk_units4<> B.wk_units3 ... 

à

AND NOT (A.wk_units2 == B.wk_units1 
OR A.wk_units3== B.wk_units2 
... 

comme cela peut être plus rapide. Mais je n'ai aucune idée de contourner les trucs de DECODE.

Questions connexes