SQL Server的GROUP BY子句中除YEAR()外还可使用哪些非聚合函数?
SQL Server GROUP BY子句可使用的函数范围说明
SQL Server的GROUP BY子句中除YEAR()之外,确实可以使用多种非聚合类函数,仅禁止使用聚合函数(如COUNT()、SUM()、AVG()等)。只要函数是基于当前行计算、返回确定性的标量值,都可以在GROUP BY中使用,常见可用函数类型如下:
- 日期时间处理类:除
YEAR()外,还支持MONTH()、DAY()、DATETRUNC()、DATEPART()、DATEDIFF()等。比如需要按订单季度分组时,可写为GROUP BY DATEPART(QUARTER, OrderDate) - 字符串处理类:支持
LEFT()、RIGHT()、SUBSTRING()、UPPER()、LOWER()、LEN()等。比如需要按用户邮箱域名分组时,可写为GROUP BY RIGHT(Email, LEN(Email)-CHARINDEX('@', Email)) - 数值计算类:支持
ROUND()、FLOOR()、CEILING()、ABS()等。比如需要按订单金额整数区间分组时,可写为GROUP BY FLOOR(OrderAmount) - 类型转换类:支持
CAST()、CONVERT()、TRY_CAST()等。比如需要按订单年月分组时,可写为GROUP BY CONVERT(VARCHAR(7), OrderDate, 120)
注意:GROUP BY子句中使用的函数表达式,必须和SELECT子句中对应的非聚合字段完全一致。比如你给出的示例中SELECT写了
year(orderDate) as year,GROUP BY也要写Year(OrderDate),不能直接用别名,也不能写其他不等价的表达式。
你也可以参考以下扩展使用示例:
-- 按订单所属月份、订单金额区间统计订单数量 SELECT CONVERT(VARCHAR(7), OrderDate, 120) AS order_month, FLOOR(OrderAmount) AS amount_segment, COUNT(OrderId) AS quantity FROM Orders GROUP BY CONVERT(VARCHAR(7), OrderDate, 120), FLOOR(OrderAmount) ORDER BY order_month, amount_segment
内容的提问来源于stack exchange,提问作者RecipeMaker1234
相关产品推荐
相关产品推荐

