ここでは、このような種類のタリーテーブルを使用する例を示します。私は実際に私のシステム上のビューとして、この全体のセットを持っているので、私は何度もそれを書くことについて心配する必要はありません。また、Where述語を変更して、DateSubmitted列の索引付けを利用できるようにしました。
--EDIT--
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
SELECT t.N AS DayOf
, COUNT(u.DateSubmitted) AS DayCount
FROM cteTally t
left join [User] u on t.N = DATEPART(DAY, DateSubmitted)
WHERE DateSubmitted >= dateadd(week, datediff(week, 0, getdate()) - 1, 0) --Beginning of last week
AND DateSubmitted < dateadd(week, datediff(week, 0, getdate()), 0) --Beginning of this week
GROUP BY t.N
は、ここで私は私が私のシステム上でこれを行うだろうかを示します。最初に私はビューとして自分のcteTallyを作成します。これは私が常時使っているもので、読み込みがゼロの状態でほぼ即座に10,000行を生成します。
create View [dbo].[cteTally] as
WITH
E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
cteTally(N) AS
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
)
select N from cteTally
GO
今実際の問題については、私はUserテーブルを作成します。この場合は、作業を簡単にするための一時テーブルを作成しました。
create table #User
(
DateSubmitted datetime
)
insert #User
select '2016-03-14' union all
select '2016-03-14' union all
select '2016-03-15' union all
select '2016-03-16' union all
select '2016-03-17' union all
select '2016-03-18';
サンプルと同じように、これには週の最初または最後の曜日のデータがありません。あなたが達成しようとしていることに合わせてクエリを少し調整する必要がありました。私の最初の投稿では、where節の日付チェックが間違っていました。これは、実際にはjoinをinner joinに変えました。私はそれらを結合述語に移動しました。これで、集計表を私たちが望む7日間に制限する必要があります。これは、DAYOFWEEK(u.DateSubmitted)を使用して達成できる他の方法がありますが、私はsargabilityを維持したいと思います。達成するために、where句にいくつかの条件を追加する必要がありました。
これはおそらく少し微調整することができますが、実際には先週の期待される結果が得られます。 1つの注意点は、もしあなたの先週が今年の終わりに及ぶならば、これに対応するために少し調整が必要ですが、大したことではないはずです。
SELECT t.N AS DayOf
, COUNT(u.DateSubmitted) AS DayCount
FROM cteTally t
left join #User u on t.N = DATEPART(DAY, DateSubmitted)
AND DateSubmitted >= dateadd(week, datediff(week, 0, getdate()) - 1, 0) --Beginning of last week
AND DateSubmitted < dateadd(week, datediff(week, 0, getdate()), 0) --Beginning of this week
where t.N >= DAY(dateadd(week, datediff(week, 0, getdate()) - 1, 0)) - 1
and t.N < day(dateadd(week, datediff(week, 0, getdate()), 0)) - 1
GROUP BY t.N
行がない場合、行を返すことはできません。何をする必要があるのは、カウントクエリへの左結合を使って、別のテーブルをクエリの基本テーブルとして使用することです。他のデータがない場合、結果に行が表示されます。 –
意味@SeanLangeになります。私は少し運があなたの応答の推論を理解することを試みた。 –
これは、数値表または集計表の優れた用途の1つです。あなたのクエリは、あなたの日付をチェックする方法とは異なります。 –