久しぶりの投稿ですが、投稿は初めてです。私は一生、自分でこれを解決することも、これを解決する答えを見つけることもできません。
部門、売上、日付の列を持つtable1があります。各行は販売を記録します。
過去 7 日間 (週末を含む) の売上を部門ごとに (Sum() を使用して) 返すクエリが必要で、売上が発生していない (日付のレコードがない) 日は値 0 で返されます)。
現在、CTE を使用して過去 7 日間の日付のリストを生成しています。コードは次のとおりです。
DECLARE @startDate datetime, @endDate datetime;
SET @startDate = DateAdd(day, -6, GetDate());
SET @endDate = GetDate();
WITH [dates_CTE] ([date]) AS
(SELECT @startDate AS [date]
UNION ALL
SELECT DATEADD(d, 1, [date]) AS [date]
FROM [dates_CTE]
WHERE [date] < @endDate)
--This part just to show contents of CTE, not used in full code
SELECT [date], CONVERT(date, [date])
FROM [dates_CTE]
ORDER BY [date] DESC
ソースから変更: https://gallery.technet.microsoft.com/scriptcenter/97fe6de5-ab27-40db-8565-637988f028a2
今、このコードを使用して Table1 からデータを選択し、欠落している日付の行を含めようとしています。ここで、売上高は NULL である必要があります (これが機能したら、ISNULL を使用して 0 に変更します)。
SELECT SUM([Table1].[sales]) AS 'Total Sales', CONVERT(date, [Table1].[date]) AS 'Date'
FROM [Table1]
RIGHT JOIN [dates_CTE]
ON CONVERT(date, [Table1].[date]) = CONVERT(date, [dates_CTE].[date])
WHERE [Department] = 'ELC'
GROUP BY CONVERT(date, [Table1].[date])
ORDER BY CONVERT(date, [Table1].[date]) DESC
CONVERT(date,) 関数を少し使いすぎたことにお気付きかもしれません。これは、Table1.date が日付のみを記録し、時刻をすべてゼロにするためです。つまり、YYYY-MM-DD 00:00:00.000 です。私のCTEは現在の日時を取得します。明らかに、時間にはゼロ以外のものがあります。したがって、私は CONVERT を使用して両方を日付のみに変換し、時間は無関係であるため無視しています。
私が何をしているように見えても (CONVERT(date,) を使用せずに、さまざまな結合を試してみましたが、役に立ちませんでした。出力は常に同じようです。値を含む 5 つのレコードしか返されません。 null / 0を読み取るだけのものがさらに2つ必要です。