У меня есть запрос, который сообщает мне, сколько записей создавалось каждый день, но если за день не было создано никаких записей, то в запросе не указана дата и нулевая сумма.
Как мне указать эти даты?
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
Все зависит от того, что вы имеете в виду. Если ваши данные не включают эти даты (что, похоже, может и не быть), то то, что сказал Йогеш, верно. В противном случае вам просто нужно ослабить запрос (возможно, ограничение «Verified = 1» вытесняет эти даты). Не зная больше о самих данных, это действительно выходит за рамки разумного ответа.
Какой СУБД продукт вы используете? «SQL» - это просто язык запросов, а не название конкретного продукта базы данных. Добавьте тег для продукта базы данных, который вы используете postgresql
, oracle
, sql-server
, db2
, ...
@ a_horse_with_no_name Я использую SSMS 17.6
Что ж, у меня есть ответ, но он тебе не понравится. Что мне пришлось сделать, так это предварительно заполнить календарную таблицу на каждый день в течение следующего десятилетия (или 100 лет или что-то еще) и LEFT OUTER JOIN из нее в вашу таблицу данных. Таким образом, у вас есть строка на каждый день, и вы можете просто ISNULL (0) ваши Результаты в своем запросе.
Это решение, которое мы должны были использовать в моей бывшей компании, кажется, взломали, но оно работает, и его легко устранить. Все остальное, что мы пытались создать динамические наборы данных, очень умный SQL, UNION множественных наборов данных и т. д., Позже закончилось проблемами, и это казалось слишком сложным. Это решение довольно простое.
Вот код для создания календарной таблицы: Как создать календарную таблицу на 100 лет на Sql
Таблицы календаря довольно распространены и полезны - я бы не стал считать это взломом.
Спасибо, @Andrew, рад слышать, что мы не пошли по неправильному пути :) Моя команда просто почувствовала, что должна быть какая-то команда в SQL или способ сделать это. Как только у нас был стол, мы использовали его МНОГО!
Есть, Йогеш опубликовал это до того, как я закончил свой ответ, так что посмотрите :)
Если у вас нет таблицы календарь, вы можете использовать запрос рекурсивный
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;
Вы должны вести одну календарную таблицу, которая может содержать все возможные даты.