如果您使用的是 SQL 2005 或更高版本,则可以使用公用表表达式动态构建日历表。在您的原始帖子中,您正在对 cu.date 进行日期数学运算,但别名 cu 代表的是用户表而不是订单表。我假设这应该是cp.date?即,您的描述谈到了订单日期,但您的 SQL 使用了用户表中的日期。
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);