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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

1792閲覧

SQLのSUM関数を抜ける

G_D

総合スコア51

SQL Server

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

2クリップ

投稿2016/06/15 08:22

SQL分の改修をしております。

現状SQL文
SUM (CASE WHEN A.test_result = '1' THEN 1 ELSE 0 END) SUM_A

やりたいこと
対象のテーブルのtest_resultに1が含まれている数を集計しているが、実際に出力するのは'あり','なし'のみ。
したがって、一つでも'1'があればその後のSUM関数は全く意味がなくなり時間の無駄になっている。
(現状SUM_Aが1万とかになり無駄な時間に処理時間が多い)
時間短縮のため、その後の集計を抜けることは可能でしょうか。
実際にSUMを使っていること自体が無駄なのでしょうか。
当方SQLにあまり詳しくなく、SQL文の修正は最小限に抑えたいとおもっております。

宜しくお願いいたします。

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

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

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

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

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

guest

回答3

0

EXISTS (Transact-SQL)

select case when exists(select test_result from A where test_result = '1') then 1 else 0 end

投稿2016/06/15 08:37

Zuishin

総合スコア28660

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

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

0

こういう場合はSUMよりCOUNTの方がよいかと思います。

SELECT COUNT(1) FROM A

WHERE A.test_result = '1';

件数が0じゃなければありで、それ以外はありということになりませんか?

投稿2016/06/15 08:25

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

別に頭から順番にデータを走査しているわけではないので
普通にインデックスが効いていれば最適処理がされるので
そもそも時間短縮にはなりません

むしろtest_resultにNULLを載せないなど適切な処理を心がけてください

投稿2016/06/16 02:12

yambejp

総合スコア114779

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

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

Zuishin

2016/06/16 02:29

sum を使っていますけれど、仮に全データが 1 であったとしてもパフォーマンスは落ちませんか?
Zuishin

2016/06/16 02:32

そして case を使って探索していますが、0 を得るためにもデータの走査が必要ではないのですか?
yambejp

2016/06/16 02:53

MS SQL Serverについては専門ではないので正確に把握していませんが 一般的なRDBであれば適切なインデックスが貼ってあれば 「さほど」落ちないはずです ちなみに例示のものは、こう書くことが多いかも SUM (A.test_result = '1')
Zuishin

2016/06/16 03:20

SQL Server タグがついているので、SQL Server Express で 3 万件のデータで計測してみました。 質問者さんのもので平均 25 秒 私のもので平均 8 秒 yambejp さんのものは残念ながらエラーでした。
Zuishin

2016/06/16 03:31

Sheabah さんのものを計測し忘れていたので、やってみました。 おそらく私のと同じくらいのタイムだろうと思っていましたが、平均 10 秒となりました。 Exists を使うことで高速化されるという結果がはっきり出たと思います。
Zuishin

2016/06/16 03:33

すみません。単位を間違っていました。 すべて「秒」ではなく「ミリ秒」と読んでください。
yambejp

2016/06/16 03:46

すみません、フォローありがとうございます 基本MySQLなので環境がなくて誤情報もうしわけないです 集計せずにWHERE句でしぼってTOPで1件抜くっていうのはどうでしょう?
Zuishin

2016/06/16 03:54

やはり 25 ミリ秒かかります。 Top でこんなにかかるのは意外でした。 もしかしたら並べ替えの作業が最適化されてないのかもしれません。
Zuishin

2016/06/16 03:58 編集

申し訳ありません。SQL を間違えていました。 Top を使うと、平均 8 ミリ秒でした。
G_D

2016/06/16 08:02

皆様ご回答ありがとうございました。 今回なるべくSQL処理の性能を向上することが目的で試行錯誤していたのですが、時間短縮にはならないのですね。。。 ほかの方のご教示通りexistsもためしてみましたが、前後の文脈もろもろありなかなかうまくいきませんでした。 何とか別のテーブルとSQL文を見直してとりあえず目指していた時間短縮にはなりましたので、本件はクローズさせていただきます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問