问:如何对转换后的日期列进行分组

Q: How to Group on Converted Datecolumns

我在 Microsoft SQL Server 2016

上使用 TSQL

我想创建一个 SQL 给我按员工、按年和月分组(过去 36 个月)的照片数量

所以这是我首先尝试的:

  select 
    count(emp) AS NumberOfPics,
    emp AS employee,
    LEFT(picdatum,4) AS YearPic,
    (Select Top 36 left(dbo.f376.picdatum,6))
FROM Storage
GROUP BY emp, LEFT(picdatum,4),  LEFT(picdatum,6)

效果不错Result of my SQL

但是日期的结果不是很好。

所以我做了第二个。

  select top 10
        CONVERT (datetime,convert(char(8),picdatum)),
    DATEPART(YYYY,CONVERT (datetime,convert(char(8),picdatum))) AS YearPic,
    DATEPART(MM, CONVERT (datetime,convert(char(8),picdatum))) AS MonthPic,
    DATEPART(WW, CONVERT (datetime,convert(char(8),picdatum))) AS WeekPic
  from storage

Datepard 和结果看起来好多了。

但是问题来了,我需要你的帮助:

如果我尝试将它与:

  select  count(emp) AS NumberOfPics,
         emp AS Employee,
        CONVERT (datetime,convert(char(8),picdatum)),
    DATEPART(YYYY,CONVERT (datetime,convert(char(8),picdatum))) AS YearPic,
    DATEPART(MM, CONVERT (datetime,convert(char(8),picdatum))) AS MonthPic,
    DATEPART(WW, CONVERT (datetime,convert(char(8),picdatum))) AS WeekPic
from storage
GROUP BY emp, YearPic,  MonthPic

估计不行,即使我再用左边的部分,结果是:

storage.picdatum 列在选择列表中无效,因为它不包含在聚合函数中,也不在 GROUP BY 子句中。

那么如何使用 Datepart 函数进行分组以及如何解决这个特定 sql 上的聚合问题?

别名在 group by 子句中不起作用 - 您需要将其替换为实际的

    select   count(emp) AS NumberOfPics,
             emp AS Employee,
             DATEPART(YYYY,CONVERT (datetime,convert(char(8),picdatum))) AS YearPic,
             DATEPART(MM, CONVERT (datetime,convert(char(8),picdatum))) AS MonthPic,
             DATEPART(WW, CONVERT (datetime,convert(char(8),picdatum))) AS WeekPic
    from storage
    GROUP BY emp, DATEPART(YYYY,CONVERT (datetime,convert(char(8),picdatum))),  DATEPART(MM, CONVERT (datetime,convert(char(8),picdatum))),DATEPART(WW, CONVERT 
(datetime,convert(char(8),picdatum)))