#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. Извиняюсь, Ларну, я сделаю все возможное, чтобы не усложнять. С уважением, Дэниел