Проблема в оракуле

Привет, ребята,

У меня есть запрос, в котором мне нужно поменять значения двух полей. Запрос выглядит следующим образом:

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_DR_VALUE в G_LEDGER_CR_VALUE, и если отрицательное значение существует в G_LEDGER_CR_VALUE, то оно должно быть в поле G_LEDGER_DR_VALUE. Может кто-нибудь помочь мне решить эту проблему?

13.10.2009 11:17:02
Я пытался понять, что это то, что вы хотите, но imho ваш вопрос не ясен. Что такое "-ве значение"?
Rob van Laarhoven 13.10.2009 11:25:34
-ve означает отрицательное значение
Linto 13.10.2009 11:32:29
Этот запрос слишком сложен (т.е. содержит слишком много элементов, не связанных с вашим вопросом). Можете ли вы упростить его, чтобы мы могли более четко увидеть, в чем конкретно заключается ваш вопрос?
Mac 13.10.2009 11:50:54
3 ОТВЕТА

Если я правильно понял ваш вопрос, вы выбираете значение (которое я назову 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
13.10.2009 11:48:37

Звучит так, будто вам нужно сочетание SIGN () и CASE ...

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

так далее

0
13.10.2009 11:49:08
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, который возвращает вам правильное значение.

0
13.10.2009 11:49:54