SQL求和值在Decode语句中相乘

时间:2017-11-28 08:56:48

标签: sql oracle sum decode

我在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,因为负值应该消除正值。

1 个答案:

答案 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;

这将寻找彼此不直接相关的借方和贷方,即使汇总可能。它还可以帮助您了解影响解码方法的数据问题