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

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

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

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

SQL

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

Q&A

解決済

2回答

248閲覧

SQLempty setをnullとして出力するには

humuhimi

総合スコア49

MySQL

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

SQL

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

0グッド

0クリップ

投稿2019/06/14 00:32

編集2019/06/14 00:52

sqlの値がない箇所をnullとして出力するにはどうしたらいいでしょうか?

sql

1mysql> select * from rental where customer_id =9;; 2+-----------+---------------------+--------------+-------------+---------------------+----------+---------------------+ 3| rental_id | rental_date | inventory_id | customer_id | return_date | staff_id | last_update | 4+-----------+---------------------+--------------+-------------+---------------------+----------+---------------------+ 5| 350 | 2005-05-27 05:01:28 | 2756 | 9 | 2005-06-04 05:01:28 | 2 | 2006-02-15 21:30:53 | 6| 877 | 2005-05-30 05:48:59 | 886 | 9 | 2005-06-02 09:30:59 | 1 | 2006-02-15 21:30:53 | 7| 1075 | 2005-05-31 10:13:34 | 2279 | 9 | 2005-06-09 08:11:34 | 1 | 2006-02-15 21:30:53 | 8| 3142 | 2005-06-20 19:59:28 | 3926 | 9 | 2005-06-28 19:51:28 | 2 | 2006-02-15 21:30:53 | 9| 3262 | 2005-06-21 04:08:43 | 3773 | 9 | 2005-06-28 02:55:43 | 1 | 2006-02-15 21:30:53 | 10| 4454 | 2005-07-07 23:37:00 | 1395 | 9 | 2005-07-11 02:30:00 | 1 | 2006-02-15 21:30:53 | 11| 4748 | 2005-07-08 13:59:38 | 4279 | 9 | 2005-07-15 16:51:38 | 1 | 2006-02-15 21:30:53 | 12| 4796 | 2005-07-08 16:35:44 | 2484 | 9 | 2005-07-13 11:08:44 | 2 | 2006-02-15 21:30:53 | 13| 5659 | 2005-07-10 07:45:40 | 4265 | 9 | 2005-07-15 05:20:40 | 1 | 2006-02-15 21:30:53 | 14+-----------+---------------------+--------------+-------------+---------------------+----------+---------------------+ 15 rows in set (0.00 sec) 16table:rental

sql

1+-------------+----------+------------+-----------+-------------------------------------+------------+--------+---------------------+---------------------+ 2| customer_id | store_id | first_name | last_name | email | address_id | active | create_date | last_update | 3+-------------+----------+------------+-----------+-------------------------------------+------------+--------+---------------------+---------------------+ 4| 1 | 1 | MARY | SMITH | MARY.SMITH@sakilacustomer.org | 5 | 1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 | 5| 2 | 1 | PATRICIA | JOHNSON | PATRICIA.JOHNSON@sakilacustomer.org | 6 | 1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 | 6| 3 | 1 | LINDA | WILLIAMS | LINDA.WILLIAMS@sakilacustomer.org | 7 | 1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 | 7| 4 | 2 | BARBARA | JONES | BARBARA.JONES@sakilacustomer.org | 8 | 1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 | 8| 5 | 1 | ELIZABETH | BROWN | ELIZABETH.BROWN@sakilacustomer.org | 9 | 1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 | 9| 6 | 2 | JENNIFER | DAVIS | JENNIFER.DAVIS@sakilacustomer.org | 10 | 1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 | 10| 7 | 1 | MARIA | MILLER | MARIA.MILLER@sakilacustomer.org | 11 | 1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 | 11| 8 | 2 | SUSAN | WILSON | SUSAN.WILSON@sakilacustomer.org | 12 | 1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 | 12| 9 | 2 | MARGARET | MOORE | MARGARET.MOORE@sakilacustomer.org | 13 | 1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 | 13| 10 | 1 | DOROTHY | TAYLOR | DOROTHY.TAYLOR@sakilacustomer.org | 14 | 1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 | 14+-------------+----------+------------+-----------+-------------------------------------+------------+--------+---------------------+---------------------+ 1510 rows in set (0.01 sec) 16table:customer

sql

1select * 2from rental 3where customer_id =9 4AND 5(rental_date >='2005-06-15 00:00:00' 6and 7rental_date <'2005-06-20 00:00:00'); 8Empty set (0.00 sec)

ustomerテーブルとrentalテーブルを⽤い、2005年6⽉15⽇〜6⽉19
⽇のレンタル本数をユーザごとに集計せよ。
ただし同期間に⼀度も購⼊していないユーザのレンタル本数はnullとして出⼒すること。
出⼒カラム︓customer_id
でやりたいです。

sql

1select 2c.customer_id 3from 4customer c 5LEFT outer JOIN 6rental r 7on 8c.customer_id = r.customer_id 9where 10(r.rental_date >='2005-06-15 00:00:00' 11and 12r.rental_date <'2005-06-20 00:00:00') 13-- and c.customer_id = 9 14group by c.customer_id 15order by c.customer_id 16limit 10 17; 18 19+-------------+ 20| customer_id | 21+-------------+ 22| 1 | 23| 2 | 24| 3 | 25| 4 | 26| 5 | 27| 6 | 28| 7 | 29| 8 | 30| 10 | 31| 11 | 32+-------------+

sql

1+-------------+----------------------+------+-----+-------------------+-----------------------------------------------+ 2| Field | Type | Null | Key | Default | Extra | 3+-------------+----------------------+------+-----+-------------------+-----------------------------------------------+ 4| customer_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | 5| store_id | tinyint(3) unsigned | NO | MUL | NULL | | 6| first_name | varchar(45) | NO | | NULL | | 7| last_name | varchar(45) | NO | MUL | NULL | | 8| email | varchar(50) | YES | | NULL | | 9| address_id | smallint(5) unsigned | NO | MUL | NULL | | 10| active | tinyint(1) | NO | | 1 | | 11| create_date | datetime | NO | | NULL | | 12| last_update | timestamp | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP | 13+-------------+----------------------+------+-----+-------------------+-----------------------------------------------+ 149 rows in set (0.04 sec) 15 16mysql> desc rental 17 -> ; 18+--------------+-----------------------+------+-----+-------------------+-----------------------------------------------+ 19| Field | Type | Null | Key | Default | Extra | 20+--------------+-----------------------+------+-----+-------------------+-----------------------------------------------+ 21| rental_id | int(11) | NO | PRI | NULL | auto_increment | 22| rental_date | datetime | NO | MUL | NULL | | 23| inventory_id | mediumint(8) unsigned | NO | MUL | NULL | | 24| customer_id | smallint(5) unsigned | NO | MUL | NULL | | 25| return_date | datetime | YES | | NULL | | 26| staff_id | tinyint(3) unsigned | NO | MUL | NULL | | 27| last_update | timestamp | NO | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP | 28+--------------+-----------------------+------+-----+-------------------+-----------------------------------------------+ 297 rows in set (0.01 sec) 30

上記のようにrental_dateの条件を満たさない値が出力されないのでそれがnullで出力されるようにして欲しいです。
よろしくお願いします。

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

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

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

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

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

maisumakun

2019/06/14 00:35

「NULL値が入った状態」とありますが、どのような構造を想定していますでしょうか。
m.ts10806

2019/06/14 00:35

「MySQL」をタグに追加しておいてください。 また「Emptyをnullとして出力」というのはどういう目的や大前提があるのでしょうか?追記してください。 ※あとSQL部分もマークダウンのcode機能を利用してご提示ください。
退会済みユーザー

退会済みユーザー

2019/06/14 00:50

rental_date のデータ型がわかるよう、CREATE TABLE文も添えてほしい。
guest

回答2

0

MySQLで連番の仮想表を作る - Hack Your Design!
にある「直近30日間の日付をリストアップ」の事例を参考に、
連続した日付の仮想表をまず作りましょう。
その仮想表に対して、rental_date由来の日付を使って
LEFT JOINすればよいかと。

その場合、仮想表の日付データが連番生成の都合上時刻成分が00:00:00でしょうから、
rental_dateで連結するときに日付データを00:00:00に丸める工夫が必要かもしれません。
(PostgreSQL民なので具体的なコードは差し控えます)

投稿2019/06/14 00:48

編集2019/06/14 01:52
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

自己解決

1個目の表にないものを2こ目の表に指定しunionしたらできました。
かなり無理矢理ですが自己解決したということでありがとうございました。

sql

1select 2c.customer_id 3,c.first_name 4,count(distinct r.rental_id) as "合計レンタル本数" 5from 6customer c 7LEFT outer JOIN 8rental r 9on 10c.customer_id = r.customer_id 11where 12r.rental_date >='2005-06-15 00:00:00' 13and 14r.rental_date <'2005-06-20 00:00:00' 15group by c.customer_id 16UNION 17SELECT 18customer_id 19,first_name 20,0 21from 22customer 23WHERE 24customer_id 25not in 26(select 27c.customer_id 28from 29customer c 30LEFT outer JOIN 31rental r 32on 33c.customer_id = r.customer_id 34where 35r.rental_date >='2005-06-15 00:00:00' 36and 37r.rental_date <'2005-06-20 00:00:00' 38group by c.customer_id ) 39group by customer_id 40order by customer_id 41limit 20 42; 43

投稿2019/06/14 04:57

編集2019/06/14 05:14
humuhimi

総合スコア49

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問