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

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

ただいまの
回答率

87.77%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 730

score 45

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

mysql> select * from rental where customer_id =9;;
+-----------+---------------------+--------------+-------------+---------------------+----------+---------------------+
| rental_id | rental_date         | inventory_id | customer_id | return_date         | staff_id | last_update         |
+-----------+---------------------+--------------+-------------+---------------------+----------+---------------------+
|       350 | 2005-05-27 05:01:28 |         2756 |           9 | 2005-06-04 05:01:28 |        2 | 2006-02-15 21:30:53 |
|       877 | 2005-05-30 05:48:59 |          886 |           9 | 2005-06-02 09:30:59 |        1 | 2006-02-15 21:30:53 |
|      1075 | 2005-05-31 10:13:34 |         2279 |           9 | 2005-06-09 08:11:34 |        1 | 2006-02-15 21:30:53 |
|      3142 | 2005-06-20 19:59:28 |         3926 |           9 | 2005-06-28 19:51:28 |        2 | 2006-02-15 21:30:53 |
|      3262 | 2005-06-21 04:08:43 |         3773 |           9 | 2005-06-28 02:55:43 |        1 | 2006-02-15 21:30:53 |
|      4454 | 2005-07-07 23:37:00 |         1395 |           9 | 2005-07-11 02:30:00 |        1 | 2006-02-15 21:30:53 |
|      4748 | 2005-07-08 13:59:38 |         4279 |           9 | 2005-07-15 16:51:38 |        1 | 2006-02-15 21:30:53 |
|      4796 | 2005-07-08 16:35:44 |         2484 |           9 | 2005-07-13 11:08:44 |        2 | 2006-02-15 21:30:53 |
|      5659 | 2005-07-10 07:45:40 |         4265 |           9 | 2005-07-15 05:20:40 |        1 | 2006-02-15 21:30:53 |
+-----------+---------------------+--------------+-------------+---------------------+----------+---------------------+
 rows in set (0.00 sec)
table:rental
+-------------+----------+------------+-----------+-------------------------------------+------------+--------+---------------------+---------------------+
| customer_id | store_id | first_name | last_name | email                               | address_id | active | create_date         | last_update         |
+-------------+----------+------------+-----------+-------------------------------------+------------+--------+---------------------+---------------------+
|           1 |        1 | MARY       | SMITH     | MARY.SMITH@sakilacustomer.org       |          5 |      1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 |
|           2 |        1 | PATRICIA   | JOHNSON   | PATRICIA.JOHNSON@sakilacustomer.org |          6 |      1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 |
|           3 |        1 | LINDA      | WILLIAMS  | LINDA.WILLIAMS@sakilacustomer.org   |          7 |      1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 |
|           4 |        2 | BARBARA    | JONES     | BARBARA.JONES@sakilacustomer.org    |          8 |      1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 |
|           5 |        1 | ELIZABETH  | BROWN     | ELIZABETH.BROWN@sakilacustomer.org  |          9 |      1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 |
|           6 |        2 | JENNIFER   | DAVIS     | JENNIFER.DAVIS@sakilacustomer.org   |         10 |      1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 |
|           7 |        1 | MARIA      | MILLER    | MARIA.MILLER@sakilacustomer.org     |         11 |      1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 |
|           8 |        2 | SUSAN      | WILSON    | SUSAN.WILSON@sakilacustomer.org     |         12 |      1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 |
|           9 |        2 | MARGARET   | MOORE     | MARGARET.MOORE@sakilacustomer.org   |         13 |      1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 |
|          10 |        1 | DOROTHY    | TAYLOR    | DOROTHY.TAYLOR@sakilacustomer.org   |         14 |      1 | 2006-02-14 22:04:36 | 2006-02-15 04:57:20 |
+-------------+----------+------------+-----------+-------------------------------------+------------+--------+---------------------+---------------------+
10 rows in set (0.01 sec)
table:customer
select *
from rental
where customer_id =9
AND
(rental_date >='2005-06-15 00:00:00'
and 
rental_date <'2005-06-20 00:00:00');
Empty set (0.00 sec)


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

select
c.customer_id
from
customer c
LEFT outer JOIN
rental r
on
c.customer_id = r.customer_id
where 
(r.rental_date >='2005-06-15 00:00:00'
and 
r.rental_date <'2005-06-20 00:00:00')
-- and c.customer_id = 9
group by c.customer_id 
order by c.customer_id
limit 10
;

+-------------+
| customer_id |
+-------------+
|           1 |
|           2 |
|           3 |
|           4 |
|           5 |
|           6 |
|           7 |
|           8 |
|          10 |
|          11 |
+-------------+
+-------------+----------------------+------+-----+-------------------+-----------------------------------------------+
| Field       | Type                 | Null | Key | Default           | Extra                                         |
+-------------+----------------------+------+-----+-------------------+-----------------------------------------------+
| customer_id | smallint(5) unsigned | NO   | PRI | NULL              | auto_increment                                |
| store_id    | tinyint(3) unsigned  | NO   | MUL | NULL              |                                               |
| first_name  | varchar(45)          | NO   |     | NULL              |                                               |
| last_name   | varchar(45)          | NO   | MUL | NULL              |                                               |
| email       | varchar(50)          | YES  |     | NULL              |                                               |
| address_id  | smallint(5) unsigned | NO   | MUL | NULL              |                                               |
| active      | tinyint(1)           | NO   |     | 1                 |                                               |
| create_date | datetime             | NO   |     | NULL              |                                               |
| last_update | timestamp            | YES  |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
+-------------+----------------------+------+-----+-------------------+-----------------------------------------------+
9 rows in set (0.04 sec)

mysql> desc rental
    -> ;
+--------------+-----------------------+------+-----+-------------------+-----------------------------------------------+
| Field        | Type                  | Null | Key | Default           | Extra                                         |
+--------------+-----------------------+------+-----+-------------------+-----------------------------------------------+
| rental_id    | int(11)               | NO   | PRI | NULL              | auto_increment                                |
| rental_date  | datetime              | NO   | MUL | NULL              |                                               |
| inventory_id | mediumint(8) unsigned | NO   | MUL | NULL              |                                               |
| customer_id  | smallint(5) unsigned  | NO   | MUL | NULL              |                                               |
| return_date  | datetime              | YES  |     | NULL              |                                               |
| staff_id     | tinyint(3) unsigned   | NO   | MUL | NULL              |                                               |
| last_update  | timestamp             | NO   |     | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
+--------------+-----------------------+------+-----+-------------------+-----------------------------------------------+
7 rows in set (0.01 sec)


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • maisumakun

    2019/06/14 09:35

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

    キャンセル

  • m.ts10806

    2019/06/14 09:35

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/06/14 09:50

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

    キャンセル

回答 2

+1

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

check解決した方法

0

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

select
c.customer_id
,c.first_name
,count(distinct r.rental_id) as "合計レンタル本数"
from
customer c
LEFT outer JOIN
rental r
on
c.customer_id = r.customer_id
where 
r.rental_date >='2005-06-15 00:00:00'
and 
r.rental_date <'2005-06-20 00:00:00'
group by c.customer_id 
UNION
SELECT
customer_id
,first_name
,0
from 
customer
WHERE
customer_id 
not in
(select
c.customer_id
from
customer c
LEFT outer JOIN
rental r
on
c.customer_id = r.customer_id
where 
r.rental_date >='2005-06-15 00:00:00'
and 
r.rental_date <'2005-06-20 00:00:00'
group by c.customer_id )
group by customer_id 
order by customer_id
limit 20
;

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る