Проблема в оракуле - PullRequest
       16

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

0 голосов
/ 13 октября 2009

Хай, ребята,

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

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 Может кто-нибудь помочь мне решить эту проблему?

Ответы [ 3 ]

0 голосов
/ 13 октября 2009

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

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

и т.д.

0 голосов
/ 13 октября 2009
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 октября 2009

Если я правильно понял ваш вопрос, вы выбираете значение (которое я назову 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...