解码语句中乘以的值的SQL和
我在PL-SQL中有以下select语句:解码语句中乘以的值的SQL和,sql,oracle,sum,decode,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; 基本上,select语句所做的是检查记录是贷方还是借方。如果是信用(值为C),则value的值保持为正,否则变
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;
基本上,select语句所做的是检查记录是贷方还是借方。如果是信用(值为C),则value
的值保持为正,否则变为负(乘以-1)。在上面示例中显示的select语句末尾,应该没有结果,因为所有记录都已对账
然而,这种情况并不总是发生。问题似乎是这样的:
SUM(DECODE(DEBIT_CREDIT,'D',-1,1) * VALUE)
似乎当一个值乘以-1时,结果并不总是返回该值的相等负值
这是PL-SQL中的已知问题吗?还有其他人遇到过吗?有办法绕过它吗
我发现绕过它的唯一方法是使用负函数,如下所示:
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\u CREDIT,decode(DEBIT\u CREDIT,'D',-1,1)*来自myTable的值,其中BATCH='0034'和CURRENCY='OMR'。结果如下
Batch Currency Debit_Credit Value
0034 OMR C 0.01
0034 OMR D -0.01
到目前为止还不错
但是,如果我像第一条PL-SQL语句中提到的那样将sum函数添加到decode中,我会得到以下结果:
Batch Currency SUM(DECODE(DEBIT_CREDIT,'D',-1,1) * VALUE)
0034 OMR 0.01
实际上,我应该得到一个0,因为负值应该消除正值。正如我在评论中提到的:
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;
这将寻找不直接相互抵消的借项和贷项,即使总和可能会相互抵消。它还可能帮助您了解影响解码方法的数据问题,如我在评论中所述:
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;
这将寻找不直接相互抵消的借项和贷项,即使总和可能会相互抵消。它还可能帮助您了解影响解码方法的数据问题是什么您能告诉我们哪些行不能正常工作吗?解码是一个非常简单的函数。只有当“D”的值为负值时,它才会返回负值结果。注意:它与PL/SQL无关。而且,负和-。。它背后有不同的逻辑。所以,您能给出解码未按预期工作的行的示例吗?您能在sqlfiddle.com上创建可复制的示例吗?使用表DDL和插入脚本。现在看起来您在另一个地方遇到了问题(类型转换、数据不正确等)。这个问题与PL/SQL无关,PL/SQL是编写存储过程等的过程语言。它是纯SQL。请更改标题和标记。在您编辑的示例中,-1和1位于不同的位置:decode(DEBIT\u-CREDIT,'D',1,-1)
和SUM(decode(DEBIT\u-CREDIT,'D',-1,1)*值)
。是这样吗?你能告诉我们哪些行它不能正常工作吗?解码是一个非常简单的函数。只有当“D”的值为负值时,它才会返回负值结果。注意:它与PL/SQL无关。而且,负和-。。它背后有不同的逻辑。所以,您能给出解码未按预期工作的行的示例吗?您能在sqlfiddle.com上创建可复制的示例吗?使用表DDL和插入脚本。现在看起来您在另一个地方遇到了问题(类型转换、数据不正确等)。这个问题与PL/SQL无关,PL/SQL是编写存储过程等的过程语言。它是纯SQL。请更改标题和标记。在您编辑的示例中,-1和1位于不同的位置:decode(DEBIT\u-CREDIT,'D',1,-1)
和SUM(decode(DEBIT\u-CREDIT,'D',-1,1)*值)
。是这样吗?