トップ回答者
GROUP BY での引き算 合計

質問
-
はじめまして質問いたします。
SUM関数を使ってテーブル作っています。
select name,sum(nyuko-syukko) as kei
from kanritable
group by name
以上のようなコードですが結果としてtable1から入力されても数字が反映されません。ちなみにtable1のデザインは
id 1
name apple
nyuko 100
syukko 20
となり nyuko 100 と入れてもその度ごとに syukko 20 を入れないと数字が反映されません。
20を入れなくても反映される方法はないでしょうか。お教え願います。
回答
-
データベースの NULL 値への対処ができていないということですね。
算術に NULL が含まれる場合、その結果も NULL になります。
sum(nyuko-syukko) とした場合、各行について次の計算が行われ、各結果に対して sum が実行されます。
1行目:100 - NULL = NULL
2行目:200 - NULL = NULL
3行目:NULL - 40 = NULL
sum は NULL の行を無視して合計してくれますが、この例の場合は結局 NULL になっちゃいますね。
対処ですが、SQL 文を以下のように isnull 関数を使ったものに変更してみてください。
こうすれば NULL 値をゼロに置き換えて処理できます。
select name, sum(isnull(nyuko, 0) - isnull(syukko, 0)) as kei
from kanritable
group by name
もしくは
select name, isnull(sum(nyuko), 0) - isnull(sum(syukko), 0) as kei
from kanritable
group by name
別の対処としては、入力されなかった項目にはゼロを格納するようにしてもいいかもしれませんね。
すべての返信
-
失礼しました、。kanritableというテーブルを作りました.デザインは
id char(10)
name char(20)
nyuko int
syukko int
です。
入力のためのフォーム form1をVC#で作りkanritableのid以下....をtextboxに四個貼り付けました。そして
id 1
name apple
nyuko 100
syukko 20
と値を入力しました。次にview1を作りました。SQLコーどは下記の通りです。
select name,sum(nyuko-syukko) as kei
from kanritable
group by name
form2にview1を貼り付け一覧表を貼り付けました。まずnyuko 100,syukko 20と入力し、次にnyuko 120,syukko 30両方入力しないとview1の一覧表に正しい計算結果 80、70が反映されないのです。ということはnyuko 100、nyuko 200とnyukoを2回続けると正しい計算結果が表示されません。nyuko 100 syukko 入力無し 、nyuko 200 syukko 入力無し、nyuko 入力無し syukko 40と順にform1から3回入力しても kei が260と正しく表示されるようにしたく考えています。よろしくお願いします。
-
データベースの NULL 値への対処ができていないということですね。
算術に NULL が含まれる場合、その結果も NULL になります。
sum(nyuko-syukko) とした場合、各行について次の計算が行われ、各結果に対して sum が実行されます。
1行目:100 - NULL = NULL
2行目:200 - NULL = NULL
3行目:NULL - 40 = NULL
sum は NULL の行を無視して合計してくれますが、この例の場合は結局 NULL になっちゃいますね。
対処ですが、SQL 文を以下のように isnull 関数を使ったものに変更してみてください。
こうすれば NULL 値をゼロに置き換えて処理できます。
select name, sum(isnull(nyuko, 0) - isnull(syukko, 0)) as kei
from kanritable
group by name
もしくは
select name, isnull(sum(nyuko), 0) - isnull(sum(syukko), 0) as kei
from kanritable
group by name
別の対処としては、入力されなかった項目にはゼロを格納するようにしてもいいかもしれませんね。 -