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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

Q&A

解決済

1回答

8070閲覧

sqlでMAXやSUMの演算の範囲内にNULLがある場合の処理

HidenoriYamano

総合スコア60

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

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

0グッド

0クリップ

投稿2016/11/29 11:22

編集2016/11/29 11:23

###前提・実現したいこと
mysqlでMAXやSUMをNULLを考慮して計算したいと思っています。
下のようなテーブにおいて、まずは
0. hc,date,soejiの順で絞り込み、その中で最大のn_0を取得したいです。その際、n_0内にNULLがある場合は、返り値をNULLにしたいです。
0. そこで取得したテーブルの中で、次はhc,dateで絞込み、先ほど取得したn_0の合計値を取得したいです。この時も、合計値の計算の中でNULLがある場合はNULLを返したいです。

###使用しているテーブルの中身の一部
+------+---------+---------+------------+--------+------+
| hc | pc | soeji | date | people | n_0 |
+------+---------+---------+------------+--------+------+
| 1160 | 2115188 | dxa2s | 2014-01-01 | 2 | 0 |
| 1160 | 2115188 | dxa2s33 | 2014-01-01 | 3 | 5 |
| 1160 | 2115188 | mmr2s2 | 2014-01-01 | 2 | NULL |
+------+---------+---------+------------+--------+------+

###NULLを無視するソースコード
NULLを考慮しないでMAXやSUMを使ってのSQL文は下のように書くことが出来ました。

SQL

1SELECT 2`hc`, `date`, SUM(num) from 3(SELECT `hc`,`date`,`soeji`,max(n_0) as num from kyoto_basic where hc = 1160 group by hc,date,soeji) as test 4group by hc,date limit 3;

SQL文のうち、カッコ内のMAXのあるSELECT文は、「前提・実現したいこと」内の1番。
その外のSUMのあるSELECT文が2番を表しています。

###出力結果
+------+------------+----------+
| hc | date | SUM(num) |
+------+------------+----------+
| 1160 | 2014-01-01 | 15 |
| 1160 | 2014-01-02 | 0 |
| 1160 | 2014-01-03 | 0 |
+------+------------+----------+

現状、NULLを除いた出力結果が出ます。
説明が難しかったので、もし状況が理解できない場合は質問していただけると助かります。。

###補足情報(言語/FW/ツール等のバージョンなど)
MySQLのバージョンは5.6.25です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

端折って書きますが、こんな感じでifで分岐してください

SQL

1create table tbl(hc int,n_0 int null); 2insert into tbl values(1160,0),(1160,5),(1160,null),(1161,10),(1161,20); 3select hc,if(sum(n_0 is null)>0,null,max(n_0)) as max from tbl group by hc;

投稿2016/11/29 12:56

yambejp

総合スコア114777

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

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

HidenoriYamano

2016/11/29 13:22 編集

なるほど。nullを数えて、なければ最大値を返すんですね。 SQLでifなどの分岐を使うのは今回が初めてだったので勉強になりました!ありがとうございます。 ちなみに自分でCASE文で組んでもうまくいったので載せておきます。 ```SQL SELECT `hc`, `date`, SUM(MAX), CASE WHEN SUM(num_NULL) > 0 THEN NULL ELSE SUM(MAX) END SUM from (SELECT `hc`,`date`,`soeji`,max(n_0) as MAX ,count(*)-count(`n_0`) as num_NULL from kyoto_basic where hc = 310077 or hc = 1160 group by hc,date,soeji) as test group by hc,date ```
yambejp

2016/11/29 13:30

蛇足ですが、SQLにおけるNULLはパフォーマンスを落とすし 挙動も迷惑で相当な嫌われ者です できるだけNULLを前提としないテーブル構成を心がけたほうがよいでしょう
HidenoriYamano

2016/11/29 13:40

yambejpさん アドバイスありがとうございます! 完全にNULL前提でテーブルを作成していたので、以後気をつけます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問