Если вы используете SQL 2005 или более позднюю версию, вы можете создать свою таблицу Calendar на лету, используя выражение общей таблицы. В исходном сообщении вы выполняете математику даты на cu.date
, но псевдоним cu
представляет таблицу Users, а не таблицу Orders. Я предполагаю, что это должно было быть cp.date
? То есть, ваше описание говорит о датах заказа, но ваш SQL использует дату в таблице Users.
With OrderDateBoundaries As
(
Select Cast(DateDiff(d,0,Min([Date]))) As MinDate
, Cast(DateDiff(d,0,Max([Date]))) As MaxDate
From Orders
)
, Calendar As
(
Select MinDate As [Date]
From OrderDateBoundaries
Union All
Select DateAdd(d, 1, [Date])
From Calendar
Where [Date] <= DateAdd(d, 1, (
Select MaxDate
From OrderDateBoundaries
))
)
Select Calendar.[Date]
, Coalesce(Sum(O.ordersum) * 40 / 100 - 0.17,0) As OrderSum
, Count(*)
, RegistrationSite
From Calendar
Left Join (Users As U
Join Orders As O
On O.userId = U.UserId)
On Cast(DateDiff(d, 0, O.OrderDate) As datetime) =Calendar.Date
Group By Calendar.[Date], registrationsite
Option(MaxRecursion 0);
Если вы хотите присоединиться к Users.Date
, то сделать это просто. Кроме того, неясно, из какой таблицы хранится таблица ordersum
.
With DateBoundaries As
(
Select Cast(DateDiff(d,0,Min([Date]))) As MinDate
, Cast(DateDiff(d,0,Max([Date]))) As MaxDate
From Users
)
, Calendar As
(
Select MinDate As [Date]
From DateBoundaries
Union All
Select DateAdd(d, 1, [Date])
From Calendar
Where [Date] <= DateAdd(d, 1, (
Select MaxDate
From DateBoundaries
))
)
Select Calendar.[Date]
, Coalesce(Sum(O.ordersum) * 40 / 100 - 0.17,0) As OrderSum
, Count(*)
, RegistrationSite
From Calendar
Left Join (Users As U
Join Orders As O
On O.userId = U.UserId)
On Cast(DateDiff(d,0,U.Date) As datetime) =Calendar.Date
Group By Calendar.[Date], RegistrationSite
Option(MaxRecursion 0);