Во-первых, я хочу сказать, что ответ gotqn является хорошим ответом - однако я думаю, что в исходном коде есть еще несколько вещей, которые можно улучшить - вот как я, вероятно, сделал бы это:
Предполагая, что даты являются последовательными, используйте общее табличное выражение для вычисления дат, используя dateadd
и row_number
.
Затем используйте другое общее табличное выражение, чтобы получить список дат и пользователей из table1
,
, а затем выберите дату и количество отдельных пользователей для каждой даты из этого общего табличного выражения, объединенного с table2
:
DECLARE @StartDate Date = '2020-02-06';
WITH Dates AS
(
SELECT TOP (60) DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY @@SPID) -1, @StartDate) As Date
FROM sys.objects
), CTE AS
(
SELECT t1.[User], t1.[Date]
FROM [X].[dbo].[Table1] AS t1
JOIN Dates
ON t1.[Date] = Dates.[Date]
WHERE [status] = 'Success'
)
SELECT cte.[Date], COUNT(DISTINCT [User])
FROM CTE
JOIN [Y].[dbo].[Table2] As t1
ON CTE.[User] = t1.[User]
AND t1.[Date2] >= CTE.[Date]
AND t1.[Date2] < DATEADD(Day, 1, CTE.[Date])
AND [Checkname] IN ('Check1','Check2')
GROUP BY cte.[Date]
Если даты не являются последовательными, вы можете использовать переменную таблицы для хранения даты вместо их вычисления с использованием общего табличного выражения.