Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解码语句中乘以的值的SQL和_Sql_Oracle_Sum_Decode - Fatal编程技术网

解码语句中乘以的值的SQL和

解码语句中乘以的值的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的值保持为正,否则变

我在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
的值保持为正,否则变为负(乘以-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)*值)
。是这样吗?