SQLのテーブルにないデータの出力

このQ&Aのポイント
  • SQLのSelect文である期間を日別に出力する方法について説明します。データが存在しない日は空白になるように出力する方法も紹介します。
  • データベースのテーブルには存在しない日もありますが、SQLのSelect文を使って期間を日別に出力する方法を教えます。
  • SQLのテーブルに存在しない日のデータも出力する方法について解説します。日にちをのぞいて空白になるように出力する方法をご紹介します。
回答を見る
  • ベストアンサー

SQLのテーブルにないデータの出力

SQLのSelect文である期間を日別に出力したいのですが、どのようにすればいいのでしょうか テーブルのデータは期間全部が入っているのではなく。 データが存在しない日もあります。 データが存在しない日は日にちをのぞいて空白になるようにしたいです。 例として、 テーブル上のデータ 2013-08-01  ああああ 2013-08-03  いいいい 2013-08-06  うううう 出力したいデータ 期間2013-08-01~2013-08-10 2013-08-01  ああああ 2013-08-02 2013-08-03  いいいい 2013-08-04 2013-08-05 2013-08-06  うううう 2013-08-07 2013-08-08 2013-08-09 2013-08-10 上記のような形で出力したいのですが、 どのようにすればいいのでしょうか http://bitstar.jp/blog/?p=2468 のように別のテーブルを用意する以外のやり方でお願いします。 よろしくお願いいたします。

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

  • ベストアンサー
回答No.3

--こんにちは。 --以下のSQLで実現可能です。SQL ServerでSQLの検証を行いました。 SELECT TBL_A.年月日 ,ISNULL(TBL_B.データ,'') AS データ FROM( SELECT '2013-08-01' AS 年月日 UNION ALL SELECT '2013-08-02' AS 年月日 UNION ALL SELECT '2013-08-03' AS 年月日 UNION ALL SELECT '2013-08-04' AS 年月日 UNION ALL SELECT '2013-08-05' AS 年月日 UNION ALL SELECT '2013-08-06' AS 年月日 UNION ALL SELECT '2013-08-07' AS 年月日 UNION ALL SELECT '2013-08-08' AS 年月日 UNION ALL SELECT '2013-08-09' AS 年月日 UNION ALL SELECT '2013-08-10' AS 年月日 ) AS TBL_A LEFT OUTER JOIN TBL_B ON TBL_A.年月日=TBL_B.年月日 --TBL_A:日付を管理するテーブル --TBL_B:日付と対になっているデータが登録されているテーブル

その他の回答 (4)

  • innoya
  • ベストアンサー率71% (10/14)
回答No.5

こんにちは。 方法として2つの案を準備しました。 まずは下記のSQLを実行して質問に書いてあるテストデータを準備します。 -- #### テーブル作成 CREATE TABLE dbo.TestData ( LogDate date , Data1 nvarchar(10) ) GO -- #### テストデータ登録 INSERT INTO dbo.TestData SELECT '2013-08-01', N'ああああ' UNION ALL SELECT '2013-08-03', N'いいいい' UNION ALL SELECT '2013-08-06', N'うううう' GO -- ################################################ -- #### 方法1:毎回日付テーブルを作成する。 -- #### 短所があり、パフォーマンス的に悪いです。 -- ################################################ DECLARE @StartDate datetime, @EndDate datetime SET @StartDate = '2013-08-01' SET @EndDate = '2013-08-10' DROP TABLE #TempDate CREATE TABLE #TempDate ( ComDay date ) DECLARE @i int SET @i = 0 WHILE (@i <= DATEDIFF(DD, @StartDate, @EndDate)) BEGIN INSERT INTO #TempDate (ComDay) VALUES (DATEADD(DD, @i, @StartDate)) SET @i = @i + 1 END SELECT A.ComDay, ISNULL(B.Data1, '') Data1 FROM #TempDate A LEFT OUTER JOIN dbo.TestData B ON A.ComDay = B.LogDate ORDER BY A.ComDay -- ################################################ -- #### 方法2:日付テーブルdbo.tComDayを作成しておいて使う。 -- #### おすすめする。 -- ################################################ SELECT A.ComDay, ISNULL(B.Data1, '') Data1 FROM dbo.tComDay A LEFT OUTER JOIN dbo.TestData B ON A.ComDay = B.LogDate WHERE A.ComDay BETWEEN @StartDate AND @EndDate ORDER BY A.ComDay 上記の方法1と方法2の実行結果 ComDay Data1 2013-08-01 ああああ 2013-08-02 2013-08-03 いいいい 2013-08-04 2013-08-05 2013-08-06 うううう 2013-08-07 2013-08-08 2013-08-09 2013-08-10

noname#209234
noname#209234
回答No.4

プロシージャを使っていいならば、プロシージャ側にパラメータ送って プロシージャ内で再帰させてカレンダーデータを戻すという案はどうでしょうか? バックアップファイルに入ってるのでサンプル載せられませんが googleでもyahooでも検索すればいくつかのサンプルが掲載されていますよ。

回答No.2

別のテーブルを用意する以外の方法よりも、日付の全部入ったカレンダーテーブルを作る方法を推奨します。

回答No.1

再帰CTEを使えば,シーケンスの作成のために別テーブルを用意しなくても同じ事ができます。

関連するQ&A

  • SQL ServerのテーブルをCSVへ出力したい

    お世話になっております。 httpで、インターネット経由にて SQL Serverのテーブルから条件に合致したデータをCSVへ出力しダウンロードする 仕組みを作りたいと考えております。 例 ■テーブルA KeyA 項目1 項目2 001 100 200 002 200 250 003 300 350 select * from KeyA =para paraはパラメタとして渡し、結果をpara.CSVのようにCSVファイルへ出力したいのです。 sqlcmdを使えば、できそうな感じだったのですがよくわからなかったのが (1)sqlcmdのSQL文にパラメタを渡すことができるのか、できるのならどうやるのか (2)出力ファイル名もパラメタ化したいのだができるのか、できるのならどうやるのか (3)ネット経由でsqlcmdを実行することができるのか、できるのならどうやるのか (環境) SQLServer2008R2 IIS ご教授頂けましたら大変ありがたいです。 よろしくお願いいたします。

  • 2つのテーブルのデータまとめて取得したい

    SQL Server2008を使用しているのですが、どうのようにデータを取得すれば良いか わからず困っております。 例えば、 名前は違うが全く同じテーブルが2つあるとします。 テーブルAには6レコード、テーブルBには3レコードのデータが存在するとします。 この時、単純に6レコード+3レコードの 9レコード分をひとつのテーブルとしてデータを 取得するにはどのようなSQL文を書けばよいでしょうか? SELECT * FROM テーブルA, テーブルBでは18レコードもデータを取得してしまい、且つ フィールド数も増加してしまいます。 宜しくお願いいたします。

  • SQLで、Join句で結合したテーブルにデータが無い場合について

    SQLについての質問です。 Join句を使ってテーブルを結合しています。 Aテーブル(社員データ)に存在する勤務区分フィールドの値に対応して、 Bテーブル(勤務データ)から勤務区分(一意)に対応したデータを持って来るSQLを作成したところ、 Bテーブルに存在しない勤務区分を持つAテーブルのデータは結果に出ませんでした。 このように、結合したBテーブルに対応するデータが無い場合でも、Aテーブルに存在するデータを全て出したい場合、 何か方法はあるのでしょうか? 現在は一度Aテーブルから全てのデータをセレクトした後に、1件1件ループしてBテーブルからセレクトする方法をしていますがもっと簡潔にできるなら簡潔にしたいと思っています。 どなたかお答え頂けると幸いです。よろしくお願いします。

  • SQL 複数のテーブルから重複なしでデータを取得

    同じフィールド名[名前]を持つテーブルが複数個あります。 仮にテーブル名を、A、B、C、Dの4個だとします。 それらのテーブルから、フィールド名[名前]のデータを重複なしで取得したいのですが、SQL文が思いつきません。 取得するフィールドは[名前]だけです。 select distinct(名前) from A union select distinct(名前) from B union select distinct(名前) from C union select distinct(名前) from D だと、各表に同じ名前が存在する場合は結果も重複してしまい、期待する結果が得られませんでした。 環境はOracle 9iです。 SQL文を教えてください。よろしくお願いします。

  • SQL:全テーブルの現在のデータ数を知りたい。

    環境 DBサーバ : Linux + Oracle9i  クライアント : WindowsXP + Oracle10g の SQLPlus(w) 当方SQL初心者です。以下のSelectを行うSQL文がわかりません。(色々悪戦苦闘しましたが) どなたかご教授下さい。 条件指定する TABLESPACE_NAME に属する、全テーブルの現在のデータ数を、 各テーブルに comment on したコメントと一緒に表示するSQLを教えて下さい。 Select 結果のイメージは以下の感じです。 TABLESPACE_NAME TABLE_NAME Count(*)    Comments ------------------ -------------- ----------- -------------------- 条件としては、  (1) where TABLESPACE_NAME like 'xxxx%' です。 そして TABLESPACE_NAME が異なれば、同じ TABLE_NAME のテーブルがありますが (1)の条件に合致する全てのテーブルを Select したいということです。 すみませんが、お分かりの方、宜しくお願い致します。

  • ASP + SQLにて

    お世話になっております。 このたびASPを使用し、SQL Serverへデータをいれ管理プログラムを作成しているのですが、一部データの取り出しがわからないのでご質問させていただきます。 SQL文を発行する際に、 strSQL = "select * from table1 left join table2 on table1.社員ID = table2.ID order by table1.ID desc" としております。 構造として table1にはID,日付,内容,社員IDがありまして table2にはID,社員名があります。 上記のSQL文を実行し、 <% response.write objRS("社員名") %> として社員名を出力しているのですが、 そのときtable1のIDを出力しようとして <% response.write objRS("ID") %> としたらtable2のIDが出力されてしまいました。 table1のIDを出力する方法はないのでしょうか? よろしくお願いいたします。

  • SQLでCSVを出力する際のNULLをどうにかしたい

    いつもお世話になっております。 SQL(2005)でクエリ文を書いて、その結果をCSV保存する際、NULLの部分が空白ではなく「NULL」と出力されてしまいます。 今まではSQL(2000)で処理しており、その時はNULLはちゃんと空白になっていたのですが、SQL(2005)でも同様にNULLを空白にして出力する方法は無いでしょうか? なお、クエリ文で変換する方法は知っていますが、SQL(2000)の頃のクエリ文を全て直すのは骨なので、出来ればSQL(2005)の設定の方で何とかできればと考えています。 新しいDBとなり、戸惑っておりますので、皆様のお知恵を拝借いたしたく、よろしくお願い致します。

  • SQLServer2000でデータ数が10万くらいあるテーブルから、

    SQLServer2000でデータ数が10万くらいあるテーブルから、 OrderByやTopなどのSQL文を使用すると、 SELECTに数秒かかってしまいます。 該当のカラムを主キーにはできないですが、 インデックス化?みたいなことをして、 SELECTを短時間化できないでしょうか?

  • SQLでDATE型のデータを参照するのは?

    SQLであるテーブルから日付型のデータを秒単位まで参照したのですが... そうですね、例えば"TABLE01"というテーブルの"Field01"っていう項目から 2000年9月7日の11:45のデータを抽出したい場合は、どような SELECT文を発行すればよろしいのでしょうか? ちなみに自分がやっているのはORACLE7です。

  • テーブルのマージSQLに関して

    初歩的なSQLの質問で申し訳ありません。 以前にも同じような内容で投稿させて頂きましたが、教えて下さい。 下記のような、ある異なる名前の同項目を持つ2つのテーブルが存在します。 《テーブル》 Aテーブル   社員番号、日付、内容、所属、時間、結果 Bテーブル  社員番号、日付、内容、理由  ※ 内容に関しては、AテーブルとBテーブルで全く違います。 これらの2つのテーブルをマージさせ、社員番号毎の内容毎、日付順に したいと考えています。 以前に以下のようなUNIONを教えてもらいましたが、所属、時間、結果、理由という 項目全てを出力するとした場合、どのように記載すれば良いでしょうか? UNIONの場合、項目が異なるとエラーとなってしまうかと、、、 《UNIONのSQL》 SELECT * FROM ( SELECT 社員番号, 日付, 内容 FROM Aテーブル UNION SELECT 社員番号, 日付, 内容 FROM Bテーブル ) ORDER BY 日付, 社員番号, 内容 教えて下さい。 よろしくお願いします。