こんにちは
日時とその時の人数データを格納しているテーブルがあり
日付をキーに0時から23時までのデータを獲得するのですが
データが存在しない時刻があり、
その時刻はブランク(NULL)で表示したいです。
外部結合とやらで実現できそうと思い、
<テーブル構成>
人数データテーブル(CNT_DATA)
日時、人数
ブランク行用テーブル(BLANK_DATA)
時(00~23)
SELECT B.時,C.人数 FROM BLANK_DATA B LEFT OUTER JOIN CNT_DATA C
ON B.時 = strftime('%H',C.日時+2415018.5)
WHERE C.日時による範囲指定
とやったのですが、
CNT_DATAに存在する時刻行しか引っ張ってこず、
ブランク行ができません。
根本的に考え方が違う様に思えてきているのですが、
どなたか教えていただけないでしょうか?
No.1ベストアンサー
- 回答日時:
私はSQLITEは試しに触ったくらいで実際に開発業務などで使った事はないので劇的に的外れかもしれないが、普通のSQL的にはLEFT OUTER JOINする側(存在しない場合にNULLになる側)をWHERE句で条件指定したらいけないんじゃないかな。
SQLITEでサブクエリーが使えるかどうかは分からんけど
SELECT B.時,C.人数 FROM BLANK_DATA B LEFT OUTER JOIN (SELECT * FROM CNT_DATA WHERE 日時による範囲指定) C ON B.時=strftime('%H',C.日時+2415018.5)
という風に、日時指定で特定の日時だけを抽出したものをLEFT OUTER JOINしてやるとか。
<別解>
C.日時による範囲指定が C.日時>='2009-01-01' and C.日時<='2009-01-31'などのように不等号で表す事ができるのならば、LEFT OUTER JOINのON句に「定数を先にして」記述する事で対応できる。LEFT OUTER JOIN的には。
SELECT B.時,C.人数 FROM BLANK_DATA B LEFT OUTER JOIN CNT_DATA C
ON B.時 = strftime('%H',C.日時+2415018.5) and '2009-01-01'<=C.日時 and '2009-01-31'>=C.日時
これはLEFT OUTER JOINの仕様なのでSQLITEがどこまでそれにそっているかによる。また、この場合は範囲指定にBETWEENは使えない。LEFT OUTER JOINのON句に記述する条件は必ず等号、不等号の右側に(ここで言う)Cテーブルが来ないといけない。
<よく分かる解説>
質問者のSQLがLEFT OUTER JOIN的にどうマズいのかについて。
ID列があるテーブルBとID列とNAME列があるテーブルCがある。
[テーブルB]
|ID|
|01|
|04|
|09|
[テーブルC]
|ID|NAME|
|01|HOGE|
|09|FUGA|
SELECT B.ID, C.ID, C.NAME FROM B LEFT OUTER JOIN C ON B.ID=C.ID
結果はこうなる
|B.ID|C.ID|C.NAME|
| 01| 01|HOGE |
| 04|NULL|NULL | ←(1)
| 09| 09|FUGA |
(1)に注目すると、この行はC.ID列がNULLとなっている。CテーブルがないためにCテーブルから抽出される列は全てNULLになる行が返される訳だ。ここで、WHERE句にC.ID BETWEEN 00 AND 99とすると、C.ID列がNULLである(1)は抽出対象から外れてしまうよね。この話自体はLEFT OUTER JOINは関係なくって、NULLはBETWEEN 00 AND 99にはヒットしないだけの話。質問者のSQLで「WHERE C.日時による範囲指定」の「C.日時」がまさにこのNULLの状態な訳だ。なのでせっかくCからの列がNULLで抽出できた行がWHERE句によってヒットしなかったという訳。
ご丁寧な回答、大変わかり易い解説ありがとうございます。
おかげさまで、意図してた結果が求められました。
Where句の位置なんて「基本中の基本」ですね・・・ お恥ずかしい
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- Visual Basic(VBA) 配列の勉強をしています。使用する変数の意味、検索条件の書き方が難しいです。 2 2022/09/15 14:06
- 会社・職場 Excel、Googleスプレッドシートなどへのデータ入力 2 2023/07/06 05:59
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- Excel(エクセル) Excelについて 3 2023/07/12 17:47
このQ&Aを見た人はこんなQ&Aも見ています
-
外出時に「待たせる妻」vs イライラする「待つ夫」は日本だけ?見習いたい海外事情
夫の家事参加に積極的なイメージのある海外でも、同様の事例はあるのか。結婚カウンセラーの佐竹悦子さんに伺ってみた。
-
select文の実行結果に空白行を入れたい
MySQL
-
テーブルからのselectにおいてデータの有無により結果をわけたい
PostgreSQL
-
SQLサーバに対するSQL文で抽出した時にないレコードを0で表示させるには?
SQL Server
-
-
4
SQLで、Join句で結合したテーブルにデータが無い場合について
SQL Server
-
5
SELECT 文の NULL列は?
PostgreSQL
-
6
sql , insert で空行(全ての列にNULLを)を一括で挿入する方法
MySQL
-
7
単一グループのグループ関数ではありません。
Oracle
-
8
データがあれば○○なければのSQL
その他(プログラミング・Web制作)
-
9
2つの列が同じ値の行を取得するSQL
Oracle
-
10
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
11
SQL Left Join で重複を排除するには
SQL Server
-
12
【DB】同じトランザクション内でupdateとselectをしたときの結果値
その他(データベース)
-
13
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
14
型 varchar から型 numeric への変換エラー。
その他(データベース)
-
15
TO_CHARで小数点以下がある場合と無い場合を切り分ける方法
その他(プログラミング・Web制作)
-
16
SELECTで1件のみ取得するには?
Oracle
-
17
PCC-S-02201エラーの対処を教えてください!
Oracle
-
18
文字列の後ろから必要分だけ削除したい。
Visual Basic(VBA)
-
19
count集計の結果が0の場合でも表示したい
SQL Server
-
20
sqlで文字列を最後に追加したい
SQL Server
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
下記の問合せを行うクエリを、 ...
-
【SQL】他テーブルに含まれる値...
-
既存データをINSERT文にして出...
-
結合したテーブルをSUMしたい
-
SQLで、Join句で結合したテ...
-
テーブル名が可変の場合のクエ...
-
改行を含んだデータのインポート
-
2つのテーブルをLIKE演算子のよ...
-
Accessの構成をコピーしたい
-
ExcelのMatch関数のようなもの...
-
パススルークエリ&ACCESSテーブ...
-
(SQL)日数の計算
-
「都道府県の面積の大きい順に...
-
データ無し時は空白行にしたい...
-
テーブルデータの上書きをした...
-
追加クエリとパラメータのクリ...
-
グループごとの一番小さい値を...
-
ADO+ODBCでテーブルに接続する...
-
一つの項目に2つのデータが含...
-
複数のテーブルからデータを取...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【SQL】他テーブルに含まれる値...
-
テーブル名が可変の場合のクエ...
-
結合したテーブルをSUMしたい
-
既存データをINSERT文にして出...
-
SQLで、Join句で結合したテ...
-
データ無し時は空白行にしたい...
-
Accessの構成をコピーしたい
-
ACCESSのVBAにてExcelに行...
-
2つのテーブルをLIKE演算子のよ...
-
SQLサーバに対するSQL文で抽出...
-
ExcelのVLOOKUP関数の動作をMyS...
-
PRIMARY KEYのコピー
-
同一テーブル内での比較(最新...
-
ExcelのMatch関数のようなもの...
-
ADO+ODBCでテーブルに接続する...
-
Access 別のDBに対してDlookup...
-
改行を含んだデータのインポート
-
複数のテーブルからデータを取...
-
ACCESS クエリーでソートの不具合
-
副問合せを使わずにUNIONと同様...
おすすめ情報