SQL SUM和值转换

时间:2017-11-12 21:38:19

标签: sql

我希望在我的C查询中转换数据,以确认某些数值本质上是否定的,尽管没有这样表示。

我寻找客户余额,其中示例数据集还包括未在数据库中写为否定的信用交易(尽管inv_type列中信用值SUM的所有记录都应视为SQL INVOICES inv_no inv_type cust_no value 1 D 25 10 2 D 35 30 3 C 25 5 4 D 25 50 5 C 35 2 函数中为负数)。举个例子:

SUM

我简单的select cust_no, sum(value) from INVOICES group by cust_no 函数无法给出正确答案:

CAST

这个查询显然会将客户25号和65号35号的余额相加,尽管预期答案是10-5 + 50 = 55和30 - 2 = 28

我应该以某种方式利用var s = '025056-03110,245056030,1,Standart Discount,Standart Discount,*15,940.00USD*,29/11/2017,1,'; var res = s.match(/\*[^*]*\*|[^\s,][^,]*/g); console.log(res);功能吗?不幸的是,我不是最新的底层数据库引擎,但它很有可能成为IBM的起源。到目前为止,大多数基本的SQL代码都已经解决了。

3 个答案:

答案 0 :(得分:1)

您可以使用case内的sum()表达式。最简单的语法是:

select cust_no,
       sum(case when inv_type = 'C' then - value else value end) as total
from invoices
group by cust_no;

请注意,value可能是数据库中的保留字,因此您可能需要转义列名。

答案 1 :(得分:0)

您应该能够首先编写投影(select)以获取基于inv_type或其他内容的有符号值列,然后对其进行求和。

像这样:

frequent

答案 2 :(得分:0)

如果发票是信用证,您可以在计算负值的总和中加上一个表达式:

select
    cust_no,
    sum
    (
        case inv_type
            when 'C' then -[value]
            else [value]
        end
    ) as [Total]
from INVOICES