繁体   English   中英

SQL-如何获取一周中每一天的记录计数

[英]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附近存在语法错误。

您的查询存在一些问题,

  1. GROUP BY必须先于ORDER BY。
  2. 所选的非聚合列也必须位于GROUP BY子句中

     SELECT Count(DateTime), ScanPoints, PostPoints... GROUP BY ScanPoints, PostPoints 
  3. 我假设您的列DateTime实际上包含一个日期和时间。 分组依据将为您提供数据中每个唯一日期/时间值的记录。 由于您需要每日数据,因此应通过将其转换为日期来减少时间。 顺便说一句,DateTime是一种数据类型,并且是列的可怕名称。

  4. 我不想使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM