Я думаю, что гораздо проще выполнить все вычисления даты заранее, тогда вы можете ссылаться на локальные переменные с логическими именами вместо того, чтобы встраивать все вычисления в виде даты / регистра и т. Д. В логику запроса.
Сделанопара предположений здесь.(1) что в будущем нет никаких данных в EmailLog (2) что под «последними 7 днями» вы подразумеваете сегодняшний день и полные 6 предыдущих дней.Я также включил общий итог - даже если он не указан в желаемом выводе, похоже, вы пытались получить его с помощью COUNT()
вне подзапроса.
DECLARE @now SMALLDATETIME = SYSDATETIME();
DECLARE @today DATE = @now,
@24hrsago SMALLDATETIME = DATEADD(DAY, -1, @now);
DECLARE @7daysago DATE = DATEADD(DAY, -6, @today),
@ThisMonth DATE = DATEADD(DAY, 1-DATEPART(DAY, @today), @today);
--SELECT @now, @today, @24hrsago, @7daysago, @ThisMonth;
WITH d AS
(
SELECT ApplicationName, c = COUNT(*)
FROM EmailLog
GROUP BY ApplicationName
),
g AS
(
SELECT
ApplicationName,
[Today] = SUM(CASE WHEN SentDt >= @today THEN 1 ELSE 0 END),
[Last24] = SUM(CASE WHEN SentDt >= @24hrsago THEN 1 ELSE 0 END),
[Last7Days] = SUM(CASE WHEN SentDt >= @7daysago THEN 1 ELSE 0 END),
[ThisMonth] = SUM(CASE WHEN SentDt >= @ThisMonth THEN 1 ELSE 0 END)
FROM EmailLog
GROUP BY ApplicationName
)
SELECT d.ApplicationName,
Total = d.c,
[Today] = COALESCE(g.[Today], 0),
[Last24] = COALESCE(g.[Last24], 0),
[Last7days] = COALESCE(g.Last7days, 0),
[ThisMonth] = COALESCE(g.ThisMonth, 0)
FROM d LEFT OUTER JOIN g
ON d.ApplicationName = g.ApplicationName;
EDIT
Если мое предположение было неверным и вам не нужно общее количество по имени приложения, запрос становится намного проще:
DECLARE @now SMALLDATETIME = SYSDATETIME();
DECLARE @today DATE = @now,
@24hrsago SMALLDATETIME = DATEADD(DAY, -1, @now);
DECLARE @7daysago DATE = DATEADD(DAY, -6, @today),
@ThisMonth DATE = DATEADD(DAY, 1-DATEPART(DAY, @today), @today);
SELECT ApplicationName,
[Today] = SUM(CASE WHEN SentDt >= @today THEN 1 ELSE 0 END),
[Last24] = SUM(CASE WHEN SentDt >= @24hrsago THEN 1 ELSE 0 END),
[Last7Days] = SUM(CASE WHEN SentDt >= @7daysago THEN 1 ELSE 0 END),
[ThisMonth] = SUM(CASE WHEN SentDt >= @ThisMonth THEN 1 ELSE 0 END)
FROM EmailLog
GROUP BY ApplicationName;
Порядок, конечно, необязательный.