我在PL-SQL中有以下select语句:
SELECT
BATCH,
CURRENCY,
SUM(DECODE(DEBIT_CREDIT,'D',-1,1) * VALUE)
FROM MYTABLE
GROUP BY BATCH, CURRENCY
HAVING SUM(DECODE(DEBIT_CREDIT,'D' ,-1,1) * VALUE) <> 0;
这来自下表:
Batch Currency Debit_Credit Value
0001 EUR D 200.00
0001 EUR C 200.00
0002 USD D 500.50
0002 USD C 500.50
基本上,select语句正在检查记录是信用卡还是借记卡。如果它是一个信用(具有值C),则value
的值保持为正,否则变为负(通过将其乘以-1)。在上面的示例中显示的select语句的末尾应该没有结果,因为所有记录都已协调。
然而,这并不总是发生。这个问题似乎就在这一行:
SUM(DECODE(DEBIT_CREDIT,'D',-1,1) * VALUE)
似乎在将值乘以-1时,结果并不总是返回值的等效负值。
这是PL-SQL中的已知问题吗?还有其他人遇到过吗?有没有办法绕过它?
我发现解决它的唯一方法是使用MINUS功能,如下所示:
Select BATCH, CURRENCY, sum(VALUE)
from MYTABLE
where DEBIT_CREDIT = 'C'
group by BATCH, CURRENCY
MINUS
Select BATCH, CURRENCY, sum(VALUE)
from MYTABLE
where DEBIT_CREDIT = 'D'
group by BATCH, CURRENCY;
此查询的结果正常工作,并返回一个空值作为结果。不过,我想找到一个更好的解决方法。
感谢任何帮助:)
修改
假设我运行查询:Select BATCH, CURRENCY, DEBIT_CREDIT, decode(DEBIT_CREDIT, 'D', -1,1) * VALUE from myTable
其中BATCH ='0034',CURRENCY ='OMR'。结果是下面的那个
Batch Currency Debit_Credit Value
0034 OMR C 0.01
0034 OMR D -0.01
到目前为止一切顺利。
但是,如果我将sum函数添加到第一个PL-SQL语句中提到的解码中,我会得到以下结果:
Batch Currency SUM(DECODE(DEBIT_CREDIT,'D',-1,1) * VALUE)
0034 OMR 0.01
实际上我应该得到0,因为负值应该消除正值。
答案 0 :(得分:2)
正如我的评论所述:
SELECT *
FROM (SELECT * FROM myTable WHERE debit_credit = 'D') d
FULL OUTER JOIN
(SELECT * FROM myTable WHERE debit_credit = 'C') c
ON
d.batch = c.batch and
d.currency = c.currency and
d.value = c.value
WHERE
c.batch IS NULL OR d.batch IS NULL;
这将寻找彼此不直接相关的借方和贷方,即使汇总可能。它还可以帮助您了解影响解码方法的数据问题