2

重複の可能性:
日付範囲から日数を生成

これが私のクエリです:

SELECT SUM(number) AS number, c_date 
    FROM my_table 
    WHERE c_date between '11/6/2012' AND '11/12/2012' 
    GROUP BY c_date 
    ORDER BY c_date DESC

このようなものが返されます

11    '11/12/2012'
9     '11/9/2012'
10    '11/8/2012'
10    '11/7/2012'
10    '11/6/2012'

ここで、返される結果に 11/11 と 11/10 を含め、それらを完全にスキップするのではなく、数値を 0 にするにはどうすればよいでしょうか。また、日付を格納する日付テーブルを作成できません。

4

2 に答える 2

0

日付範囲を返すユーザー定義関数を作成できます。次のようになります。

CREATE FUNCTION uspDateRange(@MinDate datetime, @Maxdate datetime)
RETURNS @DateRange TABLE ([Date] datetime)
AS
BEGIN
    DECLARE @Date datetime

    SET @Date = @MinDate

    WHILE (@Date < @MaxDate)
    BEGIN
        INSERT INTO @DateRange VALUES(@Date)
        SET @Date = DATEADD(day, 1, @Date)
    END

    RETURN
END
GO

範囲を選択して、2012 年 10 月のすべての日の範囲を取得できるようになりました。

SELECT * FROM uspDateRange('2012-10-01', '2013-11-01')

クエリは次のようになります。

SELECT SUM(number) AS number, c_date 
    FROM my_table t
    INNER JOIN uspDateRange('11/6/2012', '11/12/2012') r ON t.c_date = r.[Date]
    GROUP BY c_date     
    ORDER BY c_date DESC
于 2012-11-12T21:06:55.177 に答える
0

新しいテーブルを作成することはできないため、代わりの方法は「カレンダー」 CTE を構築することです。

次に、LEFT JOIN新しく作成した「カレンダー」テーブルから次の操作を実行しますmy_table

SELECT ISNULL(SUM(mt.number), 0) AS number, mc.c_date 
FROM 
    my_calendar mc LEFT JOIN
    my_table mt ON mt.c_date = mc.c_date
WHERE mc.c_date between '11/6/2012' AND '11/12/2012' 
GROUP BY mc.c_date 
ORDER BY mc.c_date DESC
于 2012-11-12T20:48:48.663 に答える