
こんにちは
日時とその時の人数データを格納しているテーブルがあり
日付をキーに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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
select文の実行結果に空白行を入れたい
MySQL
-
データがあれば○○なければのSQL
その他(プログラミング・Web制作)
-
SQLサーバに対するSQL文で抽出した時にないレコードを0で表示させるには?
SQL Server
-
-
4
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
5
SQLの集計で「全て」の合計も表示したい
その他(データベース)
-
6
SQLでSUMなどの関数でデータが無い時に0を返したい。
Oracle
-
7
SQLで、Join句で結合したテーブルにデータが無い場合について
SQL Server
-
8
sql , insert で空行(全ての列にNULLを)を一括で挿入する方法
MySQL
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【SQL】他テーブルに含まれる値...
-
Accessの構成をコピーしたい
-
既存データをINSERT文にして出...
-
ADO+ODBCでテーブルに接続する...
-
DB2のSQLコマンドについて
-
ExcelのVLOOKUP関数の動作をMyS...
-
ExcelのMatch関数のようなもの...
-
あってますか?SQL
-
SQLです!!教えてください。あ...
-
H2 DataBaseご存知の方教えて...
-
SQLサーバに対するSQL文で抽出...
-
結合したテーブルをSUMしたい
-
複数のテーブルからデータを取...
-
SELECT INTOで一度に複数の変数...
-
sqlに記述できない文字
-
フラグをたてるってどういうこ...
-
PostgreSQLのtimestamp型で時間...
-
ACCESS テキストボックスに入...
-
Excel VBAのユーザーフォームで...
-
timestampのデータはどのように...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【SQL】他テーブルに含まれる値...
-
SQLサーバに対するSQL文で抽出...
-
既存データをINSERT文にして出...
-
SQLで、Join句で結合したテ...
-
Accessの構成をコピーしたい
-
結合したテーブルをSUMしたい
-
副問合せを使わずにUNIONと同様...
-
テーブル名が可変の場合のクエ...
-
2つのテーブルをLIKE演算子のよ...
-
ExcelのMatch関数のようなもの...
-
改行を含んだデータのインポート
-
PRIMARY KEYのコピー
-
ADO+ODBCでテーブルに接続する...
-
ACCESSのVBAにてExcelに行...
-
同一テーブル内での比較(最新...
-
(SQL)日数の計算
-
ExcelのVLOOKUP関数の動作をMyS...
-
データ無し時は空白行にしたい...
-
必要なテーブルの個数について。
-
複数選択か?単数選択か? テ...
おすすめ情報