[英]SQL - How to get record count for each day of week
我有一个查询,返回从星期一开始的一周的所有记录。 我正在尝试获取一周中每一天的记录计数,但没有成功。
原始查询:
SET DATEFIRST 1 -- Beginning of week is Monday
SELECT DateTime, ScanPoints, PostPoints
FROM SmartTappScanLog
WHERE DateTime >= dateadd(day, 1-datepart(dw, getdate()), CONVERT(date,getdate()))
AND DateTime < dateadd(day, 8-datepart(dw, getdate()), CONVERT(date,getdate()))
AND UserID = '1' AND BeerID = '3'
ORDER BY DateTime ASC
我已经尝试了几种方法,包括使用Group By进行Count(DateTime):
SET DATEFIRST 1 -- Beginning of week is Monday
SELECT Count(DateTime), ScanPoints, PostPoints
FROM SmartTappScanLog
WHERE DateTime >= dateadd(day, 1-datepart(dw, getdate()), CONVERT(date,getdate()))
AND DateTime < dateadd(day, 8-datepart(dw, getdate()), CONVERT(date,getdate()))
AND UserID = '1' AND BeerID = '3'
ORDER BY DateTime ASC
GROUP BY DateTime
该错误表示GROUP附近存在语法错误。
您的查询存在一些问题,
所选的非聚合列也必须位于GROUP BY子句中
SELECT Count(DateTime), ScanPoints, PostPoints... GROUP BY ScanPoints, PostPoints
我假设您的列DateTime实际上包含一个日期和时间。 分组依据将为您提供数据中每个唯一日期/时间值的记录。 由于您需要每日数据,因此应通过将其转换为日期来减少时间。 顺便说一句,DateTime是一种数据类型,并且是列的可怕名称。
我不想使用DATEFIRST,因为它不会平等地影响所有日期函数。 如果以后将datediff与星期配合使用,则结果可能是错误的。
我的公司也将星期一作为一周的开始。 通过计算一周中第一天的移位,可以更改星期日所属的星期。
CAST(DATEADD( DAY,
(DATEPART( WEEKDAY, [YourDate] ) + 5) % 7 * -1,
[YourDate] )
AS DATE) AS FirstDayOfWeekIsMonday
使用FirstDayOfWeekIsMonday列进行周过滤/分组将确保星期日与上一个星期一相关联。
另外,此表达式可以保存,因此YourDate上的索引仍然可以使用。
分组依据应出现在订购依据之前。
您的查询应构建如下:
SET DATEFIRST 1 -- Beginning of week is Monday
SELECT Count(DateTime), ScanPoints, PostPoints
FROM SmartTappScanLog
WHERE DateTime >=
dateadd(day, 1-datepart(dw, getdate()), CONVERT(date,getdate()))
AND DateTime <
dateadd(day, 8-datepart(dw, getdate()), CONVERT(date,getdate()))
AND UserID = '1' AND BeerID = '3'
GROUP BY DateTime
ORDER BY DateTime ASC
试试看(未测试)
SET DATEFIRST 1 -- Beginning of week is Monday
SELECT datepart(dw, DateTime) as Day, ScanPoints, PostPoints, Count(DateTime) as Recs,
FROM SmartTappScanLog
WHERE DateTime >= dateadd(day, 1-datepart(dw, getdate()), CONVERT(date,getdate()))
AND DateTime < dateadd(day, 8-datepart(dw, getdate()), CONVERT(date,getdate()))
AND UserID = '1' AND BeerID = '3'
GROUP BY datepart(dw, DateTime) , ScanPoints, PostPoints
ORDER BY datepart(dw, DateTime) , ScanPoints, PostPoints
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.