2009-10-13 7 views
0

Hai les gars,Problème dans la requête oracle

J'ai une requête dans laquelle j'ai besoin d'échanger les valeurs de deux champs. La requête est la suivante:

SELECT TO_DATE(A.G_LEDGER_DATE,'dd/mm/YYY')as G_LEDGER_DATE,C.ACC_MASTER_NAME, 
    A.G_LEDGER_REF_NO , 
    NVL(CASE WHEN B.G_LEDGER_SECTION = 1 THEN 
    CASE WHEN 
    (SELECT COUNT(*)FROM SOSTRANS.ACC_GEN_LEDGER WHERE G_LEDGER_SECTION = B.G_LEDGER_SECTION AND G_LEDGER_ID = B.G_LEDGER_ID)> 1 THEN 
    B.G_LEDGER_VALUE ELSE A.G_LEDGER_VALUE END END,0) AS G_LEDGER_DR_VALUE, 
    NVL(CASE WHEN B.G_LEDGER_SECTION = -1 THEN 
    CASE WHEN 
    (SELECT COUNT(*) FROM SOSTRANS.ACC_GEN_LEDGER WHERE G_LEDGER_SECTION = B.G_LEDGER_SECTION AND G_LEDGER_ID = B.G_LEDGER_ID)> 1 THEN 
    B.G_LEDGER_VALUE ELSE A.G_LEDGER_VALUE END END,0) AS G_LEDGER_CR_VALUE, 
    B.G_LEDGER_SECTION,C.ACC_MASTER_ID,SUBSTR(A.G_LEDGER_REF_NO,0,3) AS Types,'Z' as OrderChar , 
    CASE WHEN A.G_LEDGER_REMARK IS NULL THEN B.G_LEDGER_REMARK ELSE A.G_LEDGER_REMARK END AS Narration 
    FROM SOSTRANS.ACC_GEN_LEDGER A 
    LEFT OUTER JOIN SOSTRANS.ACC_GEN_LEDGER B ON A.G_LEDGER_ID = B.G_LEDGER_ID 
    LEFT OUTER JOIN SOSMASTER.ACC_ACCOUNT_MASTER C ON A.ACC_MASTER_ID = C.ACC_MASTER_ID WHERE A.G_LEDGER_CANCEL='N' AND 
    B.ACC_MASTER_ID = 'MSOS000001' AND 
    A.ACC_MASTER_ID <> 'MSOS000001' AND 
    A.G_LEDGER_SECTION <> B.G_LEDGER_SECTION AND 
    A.G_LEDGER_DATE >= '25/sep/2009' AND 
    A.G_LEDGER_DATE<='26/sep/2009' 
    ORDER BY OrderChar,G_LEDGER_DATE 

Maintenant, j'obtenir la sortie comme

... G_LEDGER_DR_VALUE G_LEDGER_CR_VALUE ..... 
...  2000    0   ..... 
...  3000    0   ..... 
...  -1000    0   ..... 

je dois obtenir la valeur negetive du côté G_LEDGER_DR_VALUE dans G_LEDGER_CR_VALUE et si la valeur negetive existe dans G_LEDGER_CR_VALUE alors il devrait être dans le champ G_LEDGER_DR_VALUE Quelqu'un peut-il m'aider à résoudre ce problème?

+0

J'ai essayé de comprendre ce que vous voulez, mais je ne sais pas si votre question est claire. Qu'est-ce qu'une "valeur -ve"? –

+0

-ve signifie valeur negetive – Linto

+2

Cette requête est beaucoup trop compliquée (c.-à-d. Contient trop d'éléments sans rapport avec votre question). Pouvez-vous le simplifier afin que nous puissions voir plus clairement quelle est exactement votre question? – Mac

Répondre

0

Si j'ai bien compris votre question, vous sélectionnez une valeur (que j'appellerai g_ledger_value) que vous souhaitez voir apparaître dans une colonne différente en fonction de son signe.

Voilà comment je le ferais:

SELECT 
    CASE WHEN t.g_ledger_value>0 THEN t.g_ledger_value ELSE 0 END AS g_ledger_dr_value, 
    CASE WHEN t.g_ledger_value<0 THEN t.g_ledger_value ELSE 0 END AS g_ledger_cr_value 
FROM 
    (SELECT g_ledger_value FROM mytable) t; 
0

Cela ressemble à une combinaison de SIGN() et CASE est ce que vous avez besoin ...

CASE WHEN SIGN(G_LEDGER_DR_VALUE) = -1 then ... 
ELSE ... 
END 

etc

0
SELECT G_LEDGER_DR_VALUE, 
     CASE WHEN G_LEDGER_DR_VALUE < 0 
     THEN G_LEDGER_CR_VALUE 
     ELSE G_LEDGER_DR_VALUE 
     END 
FROM (...) 

Est-ce que vous voulez dire? Je suggère de calculer les valeurs de CR___VALUE et DR_VALUE dans la sous-requête, puis dans la requête d'encapsulation make CASE qui vous renvoie la valeur correcte.