2017-11-12 14 views
0

SUMクエリでデータを変換すると、一部の数値が本質的に負であることを認識するようになりましたが、そのようには表されません。SQL SUMと値の変換

私は( inv_type欄にクレジットの値 Cを持つすべてのレコードがSQL SUM機能に負として扱われるべきであるが)例えば、データセットがデータベースに負のように書かれていませんまた、信用取引を含み、顧客のバランスを探し

。例として:

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 

このクエリは明らかであるが、顧客のバランスに65と32のためのノー35のための25を合計しないだろう予想される答えは10-5 + 50 = 55と30-2 = 28

何らかの形でCASTの機能を使用するべきでしょうか?残念ながら、私は基本的なdbエンジンについて最新ではありませんが、IBM起源の可能性は十分にあります。基本的なSQLコードのほとんどはこれまでには成果を上げています。

+0

[SELECT]文に[IF]の重複があります - 列の値に基づいて出力値を選択](https://stackoverflow.com/questions/5951157/if-in-select-statement-choose-output-value列ベースの値) – caramba

+1

どの[DBMS](https://en.wikipedia.org/wiki/DBMS)製品を使用していますか? Postgres?オラクル? "_SQL_"はクエリ言語であり、特定のデータベース製品の名前ではありません。 –

答えて

0

inv_typeなどに基づいて符号付きの値列を取得し、その上で合計を実行するには、まず射影(選択)を記述する必要があります。このよう

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

は、請求書がクレジットの場合。最も簡単な構文は次のようになります。あなたは、カラム名をエスケープする必要がある場合がありますのでvalueは、データベース内の予約語である可能性があること

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

注意。

1

あなたは内部のcase表現を使用することができます:あなたが負の値を算出し、合計で式を置くことができる

select cust_no, sum(value) from (
    select cust_no 
     , case when inv_type='D' then [value] else -[value] end [value]  
    from INVOICES 
) SUMS 
group by cust_no