C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

SQLサーバーの計算式ででNULLが表示される

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■94545 / inTopicNo.1)  SQLサーバーの計算式ででNULLが表示される
  
□投稿者/ たかし (47回)-(2020/04/19(Sun) 06:33:56)

分類:[その他の言語] 

お世話になっております、たかしです。SQLサーバーについての質問です。
有給休暇の計算について教えて下さい。

前期繰越日数
新規取得日数
有給休暇合計日数(前期繰越日数+新規取得日数)
有給休暇累計日数
次年度繰越日数

次年度繰越日数を関数で計算させるときに、

CASE 有給休暇累計日数 WHEN 0.0 THEN 有給休暇合計日数 ELSE 有給休暇合計日数 + 有給休暇累計日数 END

CASE WHEN 有給休暇累計日数 = 0.0 THEN 有給休暇合計日数 ELSE 有給休暇合計日数 + 有給休暇累計日数 END

と二通り書いてみたのですが、いずれの場合も有給休暇累計日数 = 0.0のときにNULLが返されます。
本来ならば有給休暇合計日数がそのまま入るはずなのにどうしてでしょうか?
どなたかよろしくお願いいたします。


前期繰越日数 10
新規取得日数 20
有給休暇合計日数 30
有給休暇累計日数 -5
次年度繰越日数 25

前期繰越日数 10
新規取得日数 20
有給休暇合計日数 30
有給休暇累計日数  0.0
次年度繰越日数 30→ここが30とならずにNULLとなる。

引用返信 編集キー/
■94547 / inTopicNo.2)  Re[1]: SQLサーバーの計算式ででNULLが表示される
□投稿者/ furu (29回)-(2020/04/20(Mon) 10:09:41)
No94545 (たかし さん) に返信
型の問題かと思ってしまいますが、そうでもさなそうで
ちょっとわからないですね。

sqlで結果が期待通りでない場合
とにかく動くsqlからやってみるといいです。

CASE 0.0 WHEN 0.0 THEN 30 ELSE 30 + 0.0 END

これで30が返ってくれば
それぞれ列名を入れていき、どこで期待した値にならないか
わかる筈です。

有給休暇累計日数が少数を扱っていますが
float型やreal型でなく、decimal型やnumeric型にしていますか?
float型では足し算や引き算で0.0にならない場合もあります。

愚問ですが
「有給休暇合計日数 + 有給休暇累計日数」だけで
CASE文は元々必要ない?
引用返信 編集キー/
■94548 / inTopicNo.3)  Re[1]: SQLサーバーの計算式ででNULLが表示される
□投稿者/ shu (1224回)-(2020/04/20(Mon) 10:55:25)
No94545 (たかし さん) に返信
> お世話になっております、たかしです。SQLサーバーについての質問です。
> 有給休暇の計算について教えて下さい。
>
> 前期繰越日数
> 新規取得日数
> 有給休暇合計日数(前期繰越日数+新規取得日数)
> 有給休暇累計日数
> 次年度繰越日数
>
> 次年度繰越日数を関数で計算させるときに、
>
> CASE 有給休暇累計日数 WHEN 0.0 THEN 有給休暇合計日数 ELSE 有給休暇合計日数 + 有給休暇累計日数 END
>
> CASE WHEN 有給休暇累計日数 = 0.0 THEN 有給休暇合計日数 ELSE 有給休暇合計日数 + 有給休暇累計日数 END
>
> と二通り書いてみたのですが、いずれの場合も有給休暇累計日数 = 0.0のときにNULLが返されます。
> 本来ならば有給休暇合計日数がそのまま入るはずなのにどうしてでしょうか?
> どなたかよろしくお願いいたします。
>

0.0ではなくNULLになっているのではないでしょうか?

IsNull(有給休暇合計日数, 0) + IsNull(有給休暇累計日数, 0)
でどうでしょうか?

引用返信 編集キー/
■94550 / inTopicNo.4)  Re[2]: SQLサーバーの計算式ででNULLが表示される
□投稿者/ COD13 (1回)-(2020/04/20(Mon) 13:05:55)
有給休暇合計日数って項目は存在するのでしょうか?
(前期繰越日数と新規取得日数は存在し、「前期繰越日数+新規取得日数 ASを有給休暇合計日数」のようにしているのか)
有給休暇合計日数にはNULLはないですか?
前期繰越日数と新規取得日数にはNULLはないですか?
引用返信 編集キー/
■94551 / inTopicNo.5)  Re[3]: SQLサーバーの計算式ででNULLが表示される
□投稿者/ たかし (48回)-(2020/04/20(Mon) 14:34:37)
No94550 (COD13 さん) に返信
> 有給休暇合計日数って項目は存在するのでしょうか?
> (前期繰越日数と新規取得日数は存在し、「前期繰越日数+新規取得日数 ASを有給休暇合計日数」のようにしているのか)
> 有給休暇合計日数にはNULLはないですか?
> 前期繰越日数と新規取得日数にはNULLはないですか?


皆さん、早速のご回答ありがとうございます。
shu さんの方法でうまくいきました。

CASE WHEN 有給休暇累計日数 = 0.0 THEN IsNull(有給休暇合計日数 , 0) ELSE IsNull(有給休暇合計日数 , 0) + IsNull(有給休暇累計日数 , 0) END

どうもお手数をおかけしました。
また何かあったときには質問させていただきます。
解決済み
引用返信 編集キー/
■94552 / inTopicNo.6)  Re[4]: SQLサーバーの計算式ででNULLが表示される
□投稿者/ 魔界の仮面弁士 (2694回)-(2020/04/21(Tue) 10:47:12)
No94551 (たかし さん) に返信
> shu さんの方法でうまくいきました。
> CASE WHEN 有給休暇累計日数 = 0.0 THEN IsNull(有給休暇合計日数 , 0) ELSE IsNull(有給休暇合計日数 , 0) + IsNull(有給休暇累計日数 , 0) END

その CASE 式は、本当に必要ですか?

元質問の CASE 式が NULL を返すパターンというのは、
 ・有給休暇累計日数 が NULL のとき
 ・有給休暇合計日数 が NULL のとき
のいずれかのケースのはずです。(最初の質問では、この前提が間違っていたようですが)

そしてこの場合、CASE 式は不要で、shu さんが書かれたように ISNULL 関数だけで事足りるでしょう。

ISNULL(有給休暇合計日数, 0.0) + ISNULL(有給休暇累計日数, 0.0)



ただし、たとえば NULL 値を 0.0 相当として扱いつつも、
累計と合計が両方とも NULL のときだけは NULL を返したいような場合には、
CASE を使う意味もあるかもしれません。

CASE WHEN 有給休暇累計日数 IS NULL AND 有給休暇累計日数 IS NULL THEN NULL
ELSE ISNULL(有給休暇合計日数, 0.0) + ISNULL(有給休暇累計日数, 0.0) END
解決済み
引用返信 編集キー/
■94563 / inTopicNo.7)  Re[5]: SQLサーバーの計算式ででNULLが表示される
□投稿者/ たかし (49回)-(2020/04/21(Tue) 15:33:21)
No94552 (魔界の仮面弁士 さん) に返信
> ■No94551 (たかし さん) に返信
>> shu さんの方法でうまくいきました。
>>CASE WHEN 有給休暇累計日数 = 0.0 THEN IsNull(有給休暇合計日数 , 0) ELSE IsNull(有給休暇合計日数 , 0) + IsNull(有給休暇累計日数 , 0) END
>
> その CASE 式は、本当に必要ですか?
>
> 元質問の CASE 式が NULL を返すパターンというのは、
>  ・有給休暇累計日数 が NULL のとき
>  ・有給休暇合計日数 が NULL のとき
> のいずれかのケースのはずです。(最初の質問では、この前提が間違っていたようですが)
>
> そしてこの場合、CASE 式は不要で、shu さんが書かれたように ISNULL 関数だけで事足りるでしょう。
>
> ISNULL(有給休暇合計日数, 0.0) + ISNULL(有給休暇累計日数, 0.0)
>
>
>
> ただし、たとえば NULL 値を 0.0 相当として扱いつつも、
> 累計と合計が両方とも NULL のときだけは NULL を返したいような場合には、
> CASE を使う意味もあるかもしれません。
>
> CASE WHEN 有給休暇累計日数 IS NULL AND 有給休暇累計日数 IS NULL THEN NULL
> ELSE ISNULL(有給休暇合計日数, 0.0) + ISNULL(有給休暇累計日数, 0.0) END

魔界の仮面弁士様、いつもありがとうございます。
おっしゃるとおり「CASE」は不要でした。

ISNULL(有給休暇合計日数, 0.0) + ISNULL(有給休暇累計日数, 0.0)

で何も問題ありませんでした。

引用返信 編集キー/
■94568 / inTopicNo.8)  Re[6]: SQLサーバーの計算式ででNULLが表示される
□投稿者/ 通りすがり (1回)-(2020/04/21(Tue) 17:31:30)
No94563 (たかし さん) に返信
null と 0 には決定的な意味の違いがあって、今回の場合、有給休暇の計算処理をきちんと実行した
結果として日数が 0 になるなら、テーブルのすべての項目
>前期繰越日数
>新規取得日数
>有給休暇合計日数(前期繰越日数+新規取得日数)
>有給休暇累計日数
>次年度繰越日数
に null が含まれないのが理想であると思われます。

null が含まれてしまう仕様を想像すると、有給休暇を取得するような勤務データが 0 件とか、
新入社員等で有給休暇がまだ付与されていないとかが考えられますが、想定される正常な状態ならば、
計算処理が、計算結果の日数をきちんと 0 で登録することが理想だと思います。
この理想が実現されていれば、null で登録されているのは計算漏れしている社員が存在するとか、
計算処理に不備があるというような問題を見つける重要な情報になります。
つまりバグの発見に繋がります。

結果として、バグを塗りつぶして上手くいってしまう
> ISNULL(有給休暇合計日数, 0.0) + ISNULL(有給休暇累計日数, 0.0)
のようなコードは不必要なものになるかもしれません。

まあ、実際は既に歪なシステムが出来上がってしまっていたら理想通りにはいかないですし、
最初の質問文において、テーブルのデータに null の存在を全く考慮していない表現
でしたから、実際にシステムとして開発されている内容についての質問では無いのでしょう。

もし、一から作成するシステム開発であれば避けるべき状況と解決手段かもしれません。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ