2009-10-13 70 views
0

Hai guys,問題在oracle查詢

我有一個查詢,我需要交換兩個字段的值。 查詢如下:

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 

現在我得到的輸出作爲

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

我需要在G_LEDGER_CR_VALUE的G_LEDGER_DR_VALUE側的negetive值,如果在G_LEDGER_CR_VALUE存在negetive值,那麼它應該在G_LEDGER_DR_VALUE字段中 任何人都可以幫助我解決這個問題嗎?

+0

我一直在試圖瞭解它是你想要什麼,但恕我直言,你的問題並不清楚。什麼是「-ve價值」? – 2009-10-13 11:25:34

+0

-ve意味着價值 – Linto 2009-10-13 11:32:29

+2

這個查詢太複雜了(即包含太多與您的問題無關的元素)。你能簡化它,以便我們可以更清楚地看到你的問題究竟在哪裏? – Mac 2009-10-13 11:50:54

回答

0

如果我很好地理解了您的問題,請選擇一個值(我將稱其爲g_ledger_value),您希望根據其符號顯示在不同的列中。

這是我會怎麼做:

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

這聽起來像SIGN()和CASE的組合是你所需要的...

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

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

這是你的意思嗎?我建議在子查詢中計算CR___VALUE和DR_VALUE的值,然後在包裝查詢中使CASE返回正確的值。