データ無し時は空白行にしたい【SQLITE】

このQ&Aのポイント
  • データが存在しない時刻にブランク行を表示したい場合、SQLITEで外部結合を使用する方法をお教えください。
  • 問題は、CNT_DATAに存在する時刻行しか取得できず、ブランク行ができないことです。
  • 根本的な考え方が違う可能性があるため、外部結合や他の方法を教えていただけないでしょうか?
回答を見る
  • ベストアンサー

データ無し時は空白行にしたい【SQLITE】

こんにちは 日時とその時の人数データを格納しているテーブルがあり 日付をキーに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に存在する時刻行しか引っ張ってこず、 ブランク行ができません。 根本的に考え方が違う様に思えてきているのですが、 どなたか教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答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句によってヒットしなかったという訳。

a1b2c3d4e5f6g7h8
質問者

お礼

ご丁寧な回答、大変わかり易い解説ありがとうございます。 おかげさまで、意図してた結果が求められました。 Where句の位置なんて「基本中の基本」ですね・・・ お恥ずかしい

関連するQ&A

  • ACCESSのデータ型変更について

    クエリを利用してテーブルを新規作成する時に formatで書式を変換すると日付/時刻型のデータが テキスト型のデータに変わってしまったのですが 新規作成したテーブルのデータも日付/時刻型に直すには どのようにすれば出来ますか 宜しくお願いします 日時 (日付/時刻型) ―――――――――― 2002/05/31 13:54:28 2002/05/31 15:09:55 2002/06/01 10:40:06 2002/06/01 10:40:08 ――――――――――  ↓ テーブルの日時データを 日時:Format(日時,"日付 (L)")で書式を変換して テーブルを新規作成する  ↓ 日時 ―――――――――― 2002年5月31日 2002年6月1日 ――――――――――  ↓ テーブルの日時がテキスト型になってしまいます テキスト型を日付/時刻型に変更したい

  • Excel2000で連続データの空白行を挿入したい。

    Excel2000で連続データの空白行を挿入したい。 A1=B1+C1 A2=B2+C2 A3=B3+C3 (あと続く) と連続データになっているものに空白行を2行入れる方法を教えてください。 結果的に下記のようにしたいのです。 A1=B1+C1 A2=空白 A3=空白 A4=B2+C2 A5=空白 A6=空白 A7=B3+C3 (あと続く) ジャンプ機能を使うとできた気がするのですが・・・。 よく覚えていなく、わかりません。 どなたか教えてください。 よろしくお願いします。

  • Excel テーブル内の空白行の削除について

    テーブルの任意の行のデータを削除し、空白削除ボタン(cmd_Blank)をクリックすると削除したデータ行(空白行)を削除するVBAを作ったのですが空白行が1つの場合は問題なく動作するのですが(添付左)、 ・空白セルがあるとその行がすべて削除されてしまう(添付中央)。 ・空白行が2つ以上あるとエラーになってしまう(添付右) という問題に悩んでいます。 空白削除ボタンクリック時のコードは Private Sub cmdBlank_Click() ActiveSheet.ListObjects("T住所").DataBodyRange.SpecialCells(xlCellTypeBlanks).EntireRow.Delete End Sub になります。 添付の図がわかりにくいかと思いますが、ボタンクリックすると テーブル内の空白行があったら、その行のみ削除され、上詰めに したいということです。 どなたか教えていただきたいです。

  • ボットテーブル データ0の行の表示

    下記データを基にピボットテーブルを作成します。 行→府県名、学校名 列→学年 データ→人数 上記のようなテーブルを作成した時、どの学年にも生徒が居ない学校は学校名が出てこなくて困っています。 人数データの無い学校も、行として表示させるにはどうしたら良いのでしょうか? フィールドのオプションで「データなしでアイテムを表示する」を選択すると、府県×学校名 (例:学校が25校あるとすると、47×25)となってしまいます。

  • excel  複数行をまとめる 一括変換

    データ整理で困っております。 皆様のお知恵を拝借したくお願いいたします。 EXCELシートで次のようなデータがあります。   A B C D E F G H I J K 1 1 あ い 2  う え 3  お か 4  き く 5  け こ 列はA,B,Cのみにデータがあります。 行は1~5にあります。 A1は連番で数字があります。 この5行のデータが400近くあります。(約2,000行) このシートが10ほど存在します。 これらのシートを次のように1行に変換したいのです。   A B C D E F G H I J K 1 1 あ い う え お か き く け こ 2  3  4  5  行2~5はブランクのままでもかまいません。 何卒よろしくお願いいたします。

  • 空白行の削除

    エクセルのシートに下記のようなデータがあったとします。 A B C D E 1 1 2   1 2 2 3 5 3 3 3 4   3 4 4 5 4 4 このようなデータが複数のシートにあり Dの欄が空白の時、その行を削除して A B C D E 2 2 3 5 3 4 4 5 4 4 このような形にしたいのです。 一つのシート毎にはマクロを記録し、実行することでできたのですが いっぺんに複数のシートに同じ処理をかけるにはどうしたらよいでしょうか。 シートの数が多いので、いちいちシートを移動して記録したマクロを実行 するのがとても手間なのです。

  • 数式のみで 行のデータで最後に見つかったデータを行の頭にもってきたいです。

    お世話になります。 下記のようなデータがあったとします。 列名:a,b,c,d,e,f,g・・・ データ:4,,3,3,,,4・・・ データ:4,55,3,34,4,4,4・・・ データ:4,,3,3,,,4・・・ a列にはそれぞれの行の最後に値が入っていた値(ブランクは無視) を持ってきたいのですが、数式のみでこれは可能でしょうか? VBAでの実現は出来たのですが、自分がいつまでもメンテできなく、 フォーマットも変わっていき、VBAはわからないとのことなので 「最後の値を数式で頭に持ってくる」のが希望です。 IFを沢山書くにしても256列分書けないですし、 数式で繰り返しのようなものがあればいいのですが。 よろしくお願いいたします。

  • 行ごとに連番を付けたい

    例えば下記のようなデータがあったときに "Name","sub","cnt" A,a,100 B,a,200 A,b,150 A,c,110 B,b,250 ビューで WHERE (sub >= b) で A,b,150 B,b,250 を取得するのは簡単なのですが 1,A,b,150 2,B,b,250 と取得した行に対して連番を付けていきたいのですが できないでしょうか? CREATE TABLE #t ( No int IDENTITY(1,1), Name char(200), sub char(200), cnt int ) INSERT INTO #t( Name , sub , cnt ) SELECT ・・・・・・・・ とストアドではできるのですが、 ビューでできたらやりたいのです。 お願いいたします。

  • エクセル 集計行をデータの次の行に表示させたい。空白セルを削除したい。

    基準となるグループの最後のグループの集計行はなぜか、選択範囲の下に表示されます。 例えば  1行目  会社 サービス 単価  回数  合計金額  2行目   A    1   100   2    200  3行目   A    2   150   3    450  4行目   B    4   1000   4    4000  5行目   C    3   500   10   5000     以下空白   :   :   :    :  (20行目)   ここまで空白 以上のような任意の表(1行目から20行目までデータが入力されています。上記のような3社で4行で終わる場合もあれば、5社で10行という場合もあります)で会社ごとの合計金額を集計したい時に、(1行~20行を選択し、グループの基準:会社 集計の方法:合計 集計するフィールド:合計金額 集計行をデータの下に挿入という設定)  1行目  会社 サービス 単価  回数  合計金額  2行目   A    1   100   2    200  3行目   A    2   150   3    450  4行目     A集計            650  5行目   B    4   1000   4    4000  6行目     B集計            4000  7行目   C    3   500   10   5000      以下空白   :   :   :    :  23行目     C集計            5000  24行目     総計             9650 となってしまいます。上記の参考データならば 8行目から22行目までが無駄に空白ができてしまいます。 これを、8行目にC集計を表示させることはできるのでしょうか? 集計後の表をコピーして他シートに貼り付けるマクロを組んでいます。 データによっては、1つの会社の集計が表示されません。宜しくお願いいたします。上記を満たすマクロでも結構です。

  • 1行のデータをスペースで区切って各セルへ振り分けるには?

    いつもお世話になっております。 再びつまづいてしまったため、お教えいただきたく、宜しくお願い致します。 1行目はタイトル 2行目はデータ作成日 3行目は項目 が入力されております。 4行目からデータが入っているのですが、A列内に1行でまとまっている状態です。 個々のデータの間は半角スペースで区切ってあり、このスペースを利用して、3行目の項目のセルへデータを移動したいと考えております。 下記が表の状態です。 |   A  |   B   |   C  |D |E | 1|タイトル  | 2|データ作成日| 3|  番号  |都道府県コード|市町村コード|番地|備考| 4|012-3456789 04679 003 ●□△659-8 ◎●△□●~| 5|123-4567890 00367 048 ■○●△4-9-2 △●□~| 4行目からがデータ群です。B列から右側にはデータが存在しません。 理想は下記の通りです。 |   A  |   B   |   C  |   D   |E | 1|タイトル  | 2|データ作成日| 3|  番号  |都道府県コード|市町村コード|  番地   |備考| 4|012-3456789 |  04679   |  003   |●□△659-8 |◎●△□●~| 5|123-4567890 |  00367   |  048   |■○●△4-9-2|△●□~| 下記のように組んでみました。 Worksheets("Sheet1").select Range("B4").Select Dim c As Range Dim j As Variant For Each c In Selection j =Split(c.Value," ") c =Offset(0,0).Resize(1,UBound(j)+1)=j Next c End Sub 4行目のみ理想通りに動き、5行目からがどうしても動きません。 環境はExcelは2002です。 以上、宜しくお願い致します。