Вот мой исходный запрос:
SELECT
CAST(IndexedDate as varchar),
COUNT(*) AS Logins
FROM
Table
WHERE
EventType = 'Login'
AND IndexedDate > DATEADD(mm, -1, GETDATE())
GROUP BY
IndexedDate
ORDER BY
IndexedDate DESC
Это оставит пробелы, например:
2016-09-13 41 2016-09-12 31 2016-09-09 15 2016-09-08 36
Основываясь на этом вопросе, я попробовал следующие и все еще получили пробелы, но вдобавок ко всему результаты были неправильными (числа были НАМНОГО больше):
SELECT
CAST(IndexedDate as varchar),
SUM(Case When COUNT(*) Is Null Then 0 Else COUNT(*) End) AS Logins
FROM
...
Как я могу сделать так, чтобы мои результаты выглядели так?
2016-09-13 41 2016-09-12 31 2016-09-11 0 2016-09-10 0 2016-09-09 15 2016-09-08 36
Я проверил несколько других вопросов, но все они связаны с соединениями или другими факторами, не входящими в мой сценарий.
ОБНОВЛЕНИЕ
Основываясь на комментариях, я попытался создать OUTER JOIN
. Эта итерация, наконец, прошла успешно, но результаты были немного обратными...
SELECT
CAST(a.IndexedDate as varchar) as dt,
COUNT(*) AS Logins
FROM
(
SELECT *
FROM Table
WHERE IndexedDate > DATEADD(mm, -1, GETDATE())
AND EventType = 'Login'
) a
FULL OUTER JOIN (
SELECT DISTINCT(IndexedDate)
FROM Table
WHERE IndexedDate > DATEADD(mm, -1, GETDATE())
) b
ON
a.IndexedDate = b.IndexedDate
GROUP BY
b.IndexedDate
ORDER BY
b.IndexedDate DESC
Полученные результаты:
2016-09-13 41 2016-09-12 31 (null) 1 (null) 1 2016-09-09 15 2016-09-08 36
Я проверил, что агрегат b
включает недостающие даты.
n
может быть объединена с вашей таблицей по дате, чтобы получить количество (*) там, где это необходимо. - person zedfoxus   schedule 16.09.2016sql-server
) - person a_horse_with_no_name   schedule 16.09.2016OUTER JOIN
с ограниченным везением. Пожалуйста, смотрите обновление - person JOATMON   schedule 16.09.2016