アプリ版:「スタンプのみでお礼する」機能のリリースについて

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
のように別のテーブルを用意する以外のやり方でお願いします。

よろしくお願いいたします。

A 回答 (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:日付と対になっているデータが登録されているテーブル
    • good
    • 0

こんにちは。


方法として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の実行結果

ComDayData1
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


    • good
    • 0

プロシージャを使っていいならば、プロシージャ側にパラメータ送って


プロシージャ内で再帰させてカレンダーデータを戻すという案はどうでしょうか?

バックアップファイルに入ってるのでサンプル載せられませんが
googleでもyahooでも検索すればいくつかのサンプルが掲載されていますよ。
    • good
    • 1

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

    • good
    • 1

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

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す