質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Transact-SQL

Transact-SQLはSybase ASEとMIcrosoft SQLサーバで対応されているSQLの機能拡張版です。

Q&A

解決済

1回答

14879閲覧

数値がマイナスの際は、0とみなして計算する方法

cham_danb

総合スコア3

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Transact-SQL

Transact-SQLはSybase ASEとMIcrosoft SQLサーバで対応されているSQLの機能拡張版です。

0グッド

0クリップ

投稿2020/07/02 02:21

Transact-SQLでクエリを作成しています。
総量(Total)から使用量(Use)を引く式なのですが、総量がマイナスの時があります。
総量がマイナスの際は0とみなして、計算したいのですが、CASE文を入れ子にして書くと、複雑になってしまうので、他に良い方法がないか探しています。

例えば、NULLだった場合に変換するのは、ISNULL関数がありますが、マイナスだった場合に0にするような組み込み関数はないでしょうか?

TransactSQL

1SELECT 2 SUM(CASE WHEN A.PartsNo IS NOT NULL B.Convert IS NOT NULL) THEN 3 //B.Totalがマイナスのとき、0とみなして計算したい 4 (B.Total - B.Use) * B.Convert 5 ELSE B.Total - B.Use 6 END) 7FROM …以下省略

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「0として計算をする」というのが
『「計算結果を0」にする=sumが増えない』という意味なのかそれとも
『文字通りtotalを0扱いして』使用量分マイナスになるのを厭わないのか…
サブクエリ内で変換を済ませるかものぐさにapplyするかしておけばいいと思います。
計算結果を0にする場合はほかに項目をつかっていなければ
そもそもwhere句でselectから抜けば考える必要はないかも。

sql

1SELECT 2 SUM(CASE WHEN A.PartsNo IS NOT NULL B.Convert IS NOT NULL) THEN 3 //B.Totalがマイナスのとき、0とみなして計算したい 4 (X.Total2 - B.Use) * B.Convert 5 ELSE X.Total2 - B.Use 6 END) 7FROM …以下省略 8 cross apply ( 9 select case when B.Total<0 then 0 else B.Total end as Total2 10 ) as X

最初のSUMのかっこが足りないのと and か orがないような気がする。
あと計算自体を分けるんじゃなくて構成式の一つを分けたほうが
よっぽどな式でない限り見やすいと思います。

sql

1SELECT 2 SUM((X.Total2 - B.Use) 3 * (case when A.PartsNo IS NOT and NULL B.Convert IS NOT NULL then 1 else B.Convert end) 4 ) 5FROM …以下省略 6 cross apply ( 7 select case when B.Total<0 then 0 else B.Total end as Total2 8 ) as X

ぶっちゃけ「SUM((X.Total2 - B.Use)*isnull(B.Convert,1))」じゃダメなの?と思う。

投稿2020/07/02 04:27

編集2020/07/02 05:20
sousuke

総合スコア3830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cham_danb

2020/07/02 05:15

ご回答いただき、ありがとうございます。 cross applyという構文を初めて知りました。勉強になります。 実際に書いてためしてみたいと思います。
sousuke

2020/07/02 05:23

自分で書いておいてなんですがこのapplyの使い方は本懐ではないです。 applyは本当に便利な時があるのでSQL Serverやるなら覚えておいて損はないです。 outer applyとcross applyがあります。関係性はleft join とinner joinみたいな感じです。 ほかのDBにはないのでそこだけ気をつけて使いましょう。
cham_danb

2020/07/02 06:34

補足の説明もつけていただき、ありがとうございます。 ご回答いただいた内容うまくいきました! >ぶっちゃけ「SUM((X.Total2 - B.Use)*isnull(B.Convert,1))」じゃダメなの?と思う。 こちらもこれでできました。こういった使い方は応用が利きそうですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問