sql server中group by 的几种用法

本文介绍了SQLServer中Groupby语法的各种用法,包括基本的分组查询、使用DISTINCT去除重复值、利用HAVING子句进行分组后的过滤、添加汇总行以及使用WITH CUBE和WITH ROLLUP创建多维度数据集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Group by 是SQL Server 中常用的一种语法,语法如下:

[ GROUP BY [ ALL ] group_by_expression [ ,...n ]
    [ WITH { CUBE | ROLLUP } ]
] 
1、最常用的就是这种语法,如下:
Select CategoryID, AVG(UnitPrice), COUNT(UnitPrice) 
FROM dbo.Products Where UnitPrice > 30
GROUP BY CategoryID
ORDER BY CategoryID DESC
这个语句查询出,所有产品分类的产品平均单价,单价计数。并且单价在 30 以上的记录。
2、再看看这种语法,如下:
Select CategoryID, AVG(DISTINCT UnitPrice), COUNT(DISTINCT UnitPrice) 
FROM dbo.Products Where UnitPrice > 30
GROUP BY CategoryID
ORDER BY CategoryID DESC
使用 DISTINCT 的时候,将会去除重复的价格平均单价。
3、如果希望在分类统计之后,再使用条件过滤,下面的语句可以做为参数:
Select CategoryID, SUM(UnitPrice) AS SumPrice
FROM dbo.Products
GROUP BY CategoryID
HAVING SUM(UnitPrice) > 300
HAVING 与 Where 语句类似,Where 是在分类之前过滤,而 HAVING 是在分类之后过滤。
它和 Where 一样使用 AND、OR、NOT、LIKE 组合使用。
4、如果希望再在分类统计中,添加汇总行,可以使用以下语句:
Select CategoryID, SUM(UnitPrice), GROUPING(CategoryID) AS 'Grouping'
FROM dbo.Products
GROUP BY CategoryID WITH ROLLUP
Grouping 这一列用于标识出哪一行是汇总行。
它使用 ROLLUP 操作添加汇总行。
5、如果使用 WITH CUBE 将会产生一个多维分类数据集,如下:
Select CategoryID, SupplierID, SUM(UnitPrice) AS SumPrice
FROM dbo.Products
GROUP BY CategoryID, SupplierID WITH CUBE
它会产生一个交叉表,产生所有可能的组合汇总。
6、使用 ROLLUP CUBE 会产生一个 NULL 空值,可以使用以下语法解决,如下:
Select CASE WHEN (GROUPING(SupplierID) = 1) THEN '-1'
            ELSE SupplierID
       END AS SupplierID,
       SUM(UnitPrice) AS QtySum
FROM dbo.Products
GROUP BY SupplierID WITH CUBE
它首先检查当前行是否为汇总行,如果是就可以设置一个值,这里设置为 '-1' 。
 
### 结合使用 `GROUP BY` 和 `TOP` 子句 在 SQL Server 中,可以结合使用 `GROUP BY` 和 `TOP` 来获取分组后的前几条记录。为了确保结果的准确性,建议配合 `ORDER BY` 使用。 #### 示例场景 假设有一个名为 `Sales` 的表,其中包含销售数据。现在希望按产品类别 (`Category`) 分组,并找出每种类别的销售额最高的前三笔交易: ```sql SELECT TOP 3 WITH TIES Category, ProductName, SUM(SalesAmount) AS TotalSales FROM Sales GROUP BY Category, ProductName ORDER BY Category, TotalSales DESC; ``` 这段代码通过 `WITH TIES` 关键字确保即使存在并列情况也能全部显示出来[^1]。 如果想要更灵活地控制输出数量而不受制于特定类目的限制,则可以通过子查询的方式实现更为复杂的逻辑处理: ```sql WITH RankedSales AS ( SELECT Category, ProductName, SUM(SalesAmount) OVER (PARTITION BY Category ORDER BY SalesAmount DESC) AS RunningTotal, ROW_NUMBER() OVER (PARTITION BY Category ORDER BY SalesAmount DESC) as RowNum FROM Sales ) SELECT * FROM RankedSales WHERE RowNum <= 3; ``` 此方法利用窗口函数计算累积总和的同时也给每一项分配了一个序号,从而方便筛选出各分类下的前几名记录[^5]. 当仅需简单组合时可以直接应用如下结构: ```sql SELECT TOP N Column1, AggregateFunction(Column2), ... FROM Table_Name GROUP BY Column1 ORDER BY Some_Column; -- 推荐添加排序条件以稳定输出顺序[^3] ``` 这里需要注意的是,`N` 表示所期望获得的最大行数;而被选中的字段要么参与了聚集运算(如 `SUM`, `COUNT`),要么出现在 `GROUP BY` 后面列出的列清单里。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值