我不确定这是否正确,任何人都可以指导我。我试图在1个月的时间内检索我的访客登录次数,但是有一些空的计数,没有人登录。所以结果就像
DATE | COUNT
2013-12-01 2
2013-12-05 4
但我想要的是
DATE | COUNT
2013-12-01 2
2013-12-02 0
2013-12-03 0
2013-12-04 0
2013-12-05 4
所以我发现在这个网站上是使用递归日期生成然后逻辑上我想到选择日期的最终结果并加入我的成员选择。
DECLARE @startDate DATE
DECLARE @endDate DATE
SET @startDate = '2013-12-01'
SET @endDate = '2014-01-01'
;
WITH dates(Date) AS
(
SELECT @startdate as Date
UNION ALL
SELECT DATEADD(d,1,[Date])
FROM dates
WHERE DATE < @enddate
)
SELECT dates.Date, COUNT(Guest.Identity)
FROM [Membership].[dbo].[Guest]
right join
dates
on
Dates.Date = Guest.SignInDateTime and
Guest.SignInDateTime >= @startdate and
Guest.SignInDateTime < @enddate and
DATEPART(hh, Guest.SignInDateTime) >= 10 and
DATEPART(hh, Guest.SignInDateTime) <= 13
GROUP BY DATEPART(d, dates.Date)
ORDER BY dates.Date asc
但是我遇到像date.Date这样的错误在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。 任何人都可以指导我或有更好的方法吗? 提前致谢
答案 0 :(得分:0)
将group by
更改为:
GROUP BY dates.Date
您可能不希望按月份分组。完整日期更有用。
答案 1 :(得分:0)
您按DATEPART(d, dates.Date)
进行分组,但选择dates.date
。我想你想要这样的东西:
SELECT DATEPART(d, dates.Date), COUNT(Guest.Identity)
FROM [Membership].[dbo].[Guest]
right join dates on
Dates.Date = Guest.SignInDateTime and
Guest.SignInDateTime >= @startdate and
Guest.SignInDateTime < @enddate and
DATEPART(hh, Guest.SignInDateTime) >= 10 and
DATEPART(hh, Guest.SignInDateTime) <= 13
GROUP BY DATEPART(d, dates.Date)
ORDER BY DATEPART(d, dates.Date) asc
重新调用sql,假设SignInDateTime
包含时间戳,那么此查询可能不会返回您想要的结果,因为Dates.Date
只是一个日期。也许你实际上只想加入约会(正如戈登指出的那样,按dates.date
分组):
SELECT dates.Date, COUNT(Guest.Identity)
FROM Dates left join [Membership].[dbo].[Guest] on
Dates.Date = cast(Guest.SignInDateTime as date) and
Guest.SignInDateTime >= @startdate and
Guest.SignInDateTime < @enddate and
DATEPART(hh, Guest.SignInDateTime) >= 10 and
DATEPART(hh, Guest.SignInDateTime) <= 13
GROUP BY dates.Date
ORDER BY dates.Date asc