Я использую 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, чтобы проверить, находится ли он между датами начала и окончания, + 1 для истины, 0 для ложной - поэтому, если результатов нет, я всегда получу '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% эффективнее, НО не возвращает диапазон, если применяется фильтр, который возвращает нулевые результаты в указанном диапазоне дат.
Есть ли способ использовать действующее предложение 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]
Вот несколько SQL для решения WHERE:
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]