CTE を使用して日付の範囲を生成しています。
12/02/2010 10:00:00 12/02/2010 10:59:59
12/02/2010 11:00:00 12/02/2010 11:59:59
12/02/2010 12:00:00 12/02/2010 12:59:59
次に、これを大量の日付を含むインデックス付きビューに結合しました。
日付範囲をカウントするための 2 つのオプションがあります
1) log_date を SUM(case) テストして、開始日と終了日の間にあるかどうかをテストします。+ 1 は true、0 は false - したがって、結果がない場合は常に '0' を取得します。
12/02/2010 10:00:00 12/02/2010 10:59:59 0
12/02/2010 11:00:00 12/02/2010 11:59:59 1
12/02/2010 12:00:00 12/02/2010 12:59:59 0
2) 日付範囲ごとに WHERE 句を使用してカウント (*) できます。
12/02/2010 11:00:00 12/02/2010 11:59:59 1
ご想像のとおり、1) 効果的ですが、パフォーマンスに大きなオーバーヘッドがあります 2) おそらく 8000% 効率的ですが、指定された日付範囲の間に null の結果を返すフィルターが適用されている場合、範囲を返すことができません。
効率的な WHERE 句を使用する方法はありますが、「0」の日付範囲行を保持しますか?
ケースソリューションのSQLは次のとおりです。
SELECT [LABEL], [Display Start Date], [Display End Date],
SUM(CASE WHEN ([LOG].line_date BETWEEN [Start Date] AND [End Date]) THEN 1 ELSE 0 END) AS [Total Calls],
SUM(CASE WHEN ([LOG].line_date BETWEEN [Start Date] AND [End Date]) AND ([LOG].line_result = 1) THEN 1 ELSE 0 END) AS [1 Calls],
FROM [DATE RANGE FUNCTION] LEFT JOIN
dbo.vCallLog WITH (noexpand) as [LOG] on 0 > -1
GROUP BY [Start Date], [End Date], [Display Start Date], [Display End Date], [LABEL]
WHERE ソリューションの SQL は次のとおりです。
SELECT [LABEL], [Display Start Date], [Display End Date],
COUNT(dbo.vCallLog.line_id) AS [Total Calls],
SUM(CASE WHEN ([LOG].line_result = 1) THEN 1 ELSE 0 END) AS [1 Calls],
FROM [DATE RANGE FUNCTION] LEFT JOIN
dbo.vCallLog WITH (noexpand) as [LOG] on 0> -1
WHERE ([LOG].line_date BETWEEN [Start Date] AND [End Date])
GROUP BY [Start Date], [End Date], [Display Start Date], [Display End Date], [LABEL]