oracle查询中的问题

时间:2009-10-13 11:17:03

标签: oracle

Hai guys,

我有一个查询,我需要交换两个字段的值。 查询如下:

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字段中 任何人都可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

听起来像是SIGN()和CASE的组合是你需要的......

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

答案 2 :(得分: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返回正确的值。