При подсчете количества записей в день, как мне включить дни, в которых нет записей?

У меня есть запрос, который сообщает мне, сколько записей создавалось каждый день, но если за день не было создано никаких записей, то в запросе не указана дата и нулевая сумма.

При подсчете количества записей в день, как мне включить дни, в которых нет записей?

Как мне указать эти даты?

SELECT Convert(VARCHAR, CreatedDate, 101) as "Date", count(result_ID) as "Results"
FROM Results
WHERE CreatedDate >=dateadd(day,datediff(day,0,GetDate())- 90,0)
AND Verified = 1
GROUP BY Convert(VARCHAR, CreatedDate, 101)
Order by "Date" desc

Вы должны вести одну календарную таблицу, которая может содержать все возможные даты.

Yogesh Sharma 01.05.2018 20:50

Все зависит от того, что вы имеете в виду. Если ваши данные не включают эти даты (что, похоже, может и не быть), то то, что сказал Йогеш, верно. В противном случае вам просто нужно ослабить запрос (возможно, ограничение «Verified = 1» вытесняет эти даты). Не зная больше о самих данных, это действительно выходит за рамки разумного ответа.

Jiggles32 01.05.2018 20:55

Какой СУБД продукт вы используете? «SQL» - это просто язык запросов, а не название конкретного продукта базы данных. Добавьте тег для продукта базы данных, который вы используете postgresql, oracle, sql-server, db2, ...

a_horse_with_no_name 02.05.2018 15:27

@ a_horse_with_no_name Я использую SSMS 17.6

Joe Taberna 02.05.2018 21:54
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
4
47
2

Ответы 2

Что ж, у меня есть ответ, но он тебе не понравится. Что мне пришлось сделать, так это предварительно заполнить календарную таблицу на каждый день в течение следующего десятилетия (или 100 лет или что-то еще) и LEFT OUTER JOIN из нее в вашу таблицу данных. Таким образом, у вас есть строка на каждый день, и вы можете просто ISNULL (0) ваши Результаты в своем запросе.

Это решение, которое мы должны были использовать в моей бывшей компании, кажется, взломали, но оно работает, и его легко устранить. Все остальное, что мы пытались создать динамические наборы данных, очень умный SQL, UNION множественных наборов данных и т. д., Позже закончилось проблемами, и это казалось слишком сложным. Это решение довольно простое.

Вот код для создания календарной таблицы: Как создать календарную таблицу на 100 лет на Sql

Таблицы календаря довольно распространены и полезны - я бы не стал считать это взломом.

Andrew 01.05.2018 21:05

Спасибо, @Andrew, рад слышать, что мы не пошли по неправильному пути :) Моя команда просто почувствовала, что должна быть какая-то команда в SQL или способ сделать это. Как только у нас был стол, мы использовали его МНОГО!

sniperd 01.05.2018 21:07

Есть, Йогеш опубликовал это до того, как я закончил свой ответ, так что посмотрите :)

Andrew 01.05.2018 21:08

Если у вас нет таблицы календарь, вы можете использовать запрос рекурсивный

with cte as (
    select MIN(date) mndt, MAX(date) mxdt
    from Results
    union all
    select DATEADD(DAY, 1, mndt) mndt, mxdt 
    from cte c
    where mndt < mxdt
)
select c.mndt as date,
       (select count(result_ID) from Results where date = c.mndt) as Results
from cte c;  

Другие вопросы по теме