- ベストアンサー
SQLのテーブルにないデータの出力
- SQLのSelect文である期間を日別に出力する方法について説明します。データが存在しない日は空白になるように出力する方法も紹介します。
- データベースのテーブルには存在しない日もありますが、SQLのSelect文を使って期間を日別に出力する方法を教えます。
- SQLのテーブルに存在しない日のデータも出力する方法について解説します。日にちをのぞいて空白になるように出力する方法をご紹介します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
--こんにちは。 --以下の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)
こんにちは。 方法として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
プロシージャを使っていいならば、プロシージャ側にパラメータ送って プロシージャ内で再帰させてカレンダーデータを戻すという案はどうでしょうか? バックアップファイルに入ってるのでサンプル載せられませんが googleでもyahooでも検索すればいくつかのサンプルが掲載されていますよ。
- 原沢 信道(@nharasawa)
- ベストアンサー率53% (90/168)
別のテーブルを用意する以外の方法よりも、日付の全部入ったカレンダーテーブルを作る方法を推奨します。
- Yune-Kichi
- ベストアンサー率74% (465/626)
再帰CTEを使えば,シーケンスの作成のために別テーブルを用意しなくても同じ事ができます。