T-sql как добавить дни, когда нет данных в диапазоне дат

#sql-server #tsql #select #add #days

#sql-сервер #tsql #выберите #Добавить #дни

Вопрос:

Мне нужен запрос, и это может быть только оператор выбора, без cte, функций и т.д., Из-за ограничений используемого мной решения для создания отчетов, для заполнения дней при выборе диапазона дат, а для некоторых дней нет значений, это для отображения тенденции на графике, и руководство хочет видеть все дни, даже если нет данных.

примечание. я использую фильтр диапазона дат «от даты» и «до даты».

Комментарии:

1. Создайте таблицу календаря, затем присоединитесь к ней.

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

3. Строки должны откуда-то поступать. Это должна быть либо функция, CTE, либо таблица. Вы не можете «волшебным образом» создать их. Если вы даже не можете сделать JOIN , тогда я предлагаю найти какое-нибудь лучшее программное обеспечение для создания отчетов; поскольку это проблема здесь. Любое базовое программное обеспечение для создания отчетов позволит вам предоставить запрос в качестве источника набора данных, который может включать JOIN и даже такие выражения, как CTE.

4. Может ли это быть SELECT из VIEW ? Если это так, то вы можете делать все, что хотите в VIEW , например, используя базовый JOIN синтаксис. Если нет, то я возвращаюсь к своему предыдущему комментарию; получите лучшее программное обеспечение для создания отчетов.

5. да, я понимаю вас, но это то, с чем мне, к сожалению, придется работать.

Ответ №1:

У нас было много противоречивых ограничений как в вопросе, так и в комментариях о том, что вы можете (и не можете) делать. От «это может быть только оператор select» и «нет cte, функций и т.д.», До «нельзя также использовать представление», а также гораздо менее ограничивающее «до тех пор, пока оно начинается с выбора». Последнее означает, что, помимо CTE, вы можете использовать VIEW , FUNCTION и JOIN .

Поэтому, как я предлагал в своем первом комментарии, составьте таблицу календаря. Очень простыми словами:

 CREATE TABLE dbo.CalendarTable (CalendarDate date NOT NULL PRIMARY KEY,
                                CalenderYear AS DATEPART(YEAR, CalendarDate) PERSISTED,
                                CalenderMonth AS DATEPART(MONTH, CalendarDate) PERSISTED,
                                CalenderDay AS DATEPART(DAY, CalendarDate) PERSISTED,
                                CalenderMonthName AS DATENAME(MONTH, CalendarDate) PERSISTED); --Some example columns

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 AS I
    FROM N N1, N N2, N N3, N N4),
Dates AS(
    SELECT CONVERT(date,DATEADD(DAY, T.I, '20000101')) AS CalendarDate
    FROM Tally T)
INSERT INTO dbo.CalendarTable(CalendarDate)
SELECT CalendarDate
FROM Dates;
GO

SELECT *
FROM dbo.CalendarTable;
  

Тогда это так же просто, как JOIN :

 SELECT CT.CalendarDate,
       {Your Other Columns}
FROM dbo.YourTable YT
     JOIN dbo.CalendarTable CT ON YT.StartDate <= CT.CalendarDate
                              AND YT.EndDate >= CT.CalendarDate;
  

Комментарии:

1. не удается создать таблицы, возможно, я должен был сказать, что объекты не могут быть созданы, все должно быть за один раз.

2. Вы создаете таблицу отдельно, @AlbertoCaeiro … Не в инструкции, используемой в отчете.

3. Однако, пожалуйста, прекратите перемещать сообщения о целях. На этом этапе вы перемещали их слишком много раз. Если вы не знаете, где находятся сообщения о целях, сделайте шаг назад, выясните, а затем отправьте свой вопрос с реальной целью.

4. Комментарии не для новых вопросов, @AlbertoCaeiro .

5. Извиняюсь, Ларну, я сделаю все возможное, чтобы не усложнять. С уважением, Дэниел