Group by ALL

Group by ALL 。和不加ALL差别就是加了ALL后包含所有组和结果集,甚至包含那些其中任何行都不满足 WHERE 子句指定的搜索条件的组和结果集。注意的是指定了 ALL,将对组中不满足搜索条件的汇总列返回空值。

declare @t table(id int,col char(2))
insert @t select 1,'a'
insert @t select 1,'a'
insert @t select 2,'a'
insert @t select 3,'a'
insert @t select 3,'a'
insert @t select 4,'a'
insert @t select 5,'a'
insert @t select 5,'a'
insert @t select 5,'a'
--1
select id,COUNT(1)
from @t
group by id
--2
select id,COUNT(1)
from @t
where id < 3
group by id
针对上面的数据我们可以得到显而意见的结果 :
/*
id         
----------- -----------
1           2
2           1
3           2
4           1
5           3
(5 行受影响)
id         
----------- -----------
1           2
2           1
(2 行受影响)
*/
   那么如果我们想要得到如下结果呢?
/*
id         
----------- -----------
1           2
2           1
3           0
4           0
5           0
*/
--显然大家一看就知道我的意思了吧,常规有人一定会union联合、子查询什么的吧,有没有想过其实可以简单点呀,看看下面的语法:
--3
select id,COUNT(1)
from @t
where id < 3
group by all id
    结果大家自己运行一下就有答案了。
最后后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,如果以后的项目里有使用的话还是着手修改当前还在使用该功能的应用程序吧。另外还得注意三点:1、CUBE 或 ROLLUP 运算符不能和ALL同时使用。2、如果在访问远程表的查询中还有 WHERE 子句,则该查询不支持 GROUP BY ALL。3、对于具有 FILESTREAM 属性的列,GROUP BY ALL将不被支持。

SQL 中的 `GROUP BY ALL` 是一种特殊的分组方式,它允许在分组查询时保留那些未在 `SELECT` 子句中显式聚合的列,前提是这些列的值在分组中是唯一的。与标准的 `GROUP BY` 不同,`GROUP BY ALL` 不强制要求 `SELECT` 子句中的所有非聚合列都出现在 `GROUP BY` 子句中,只要这些列的值在每个分组中是唯一的。 ### 使用场景 `GROUP BY ALL` 常用于以下情况: - 当某些列在逻辑上是唯一的,即使它们没有在 `GROUP BY` 子句中指定,也可以安全地包含在 `SELECT` 子句中。 - 在 SQL Server 中,`GROUP BY ALL` 可以简化查询,减少 `GROUP BY` 子句中的列数,尤其是在多个查询结果集合并时。 ### 示例 假设有一个销售表 `Sales`,包含如下字段: - `Region`:地区 - `Commodity`:商品 - `SalesVolume`:销量 以下是一个使用 `GROUP BY ALL` 的示例: ```sql SELECT Region, Commodity, SUM(SalesVolume) AS TotalSales FROM Sales GROUP BY ALL Region, Commodity; ``` 在这个例子中,`Region` 和 `Commodity` 被用作分组依据。即使 `Commodity` 在 `GROUP BY` 子句中没有显式指定为唯一列,只要它在每个 `Region` 分组中是唯一的,就可以安全地包含在 `SELECT` 子句中。 ### 注意事项 - `GROUP BY ALL` 在 SQL Server 中已被弃用,Microsoft 建议避免在新开发工作中使用它,因为它可能在未来的版本中被删除[^1]。 - 在 Microsoft Access 中,并不支持 `GROUP BY ALL`,因此需要通过多列分组来实现类似的功能。 ### GROUPING SETS 与 GROUP BY ALL 的对比 `GROUPING SETS` 是另一种分组机制,它允许在一个查询中指定多个分组集,结果等效于对每个分组集执行 `UNION ALL` 操作。虽然 `GROUPING SETS` 和 `GROUP BY ALL` 都可以实现多维度的分组,但它们的应用场景不同。`GROUPING SETS` 更适合于需要对不同维度进行聚合的情况,而 `GROUP BY ALL` 更适合于简化 `GROUP BY` 子句中的列数[^2]。 ```sql SELECT Region, Commodity, SUM(SalesVolume) AS TotalSales FROM Sales GROUP BY GROUPING SETS (ROLLUP(Region, Commodity), CUBE(Region, Commodity)); ``` 在这个例子中,`GROUPING SETS` 被用来同时计算 `ROLLUP` 和 `CUBE` 的结果,提供多维度的汇总数据。 --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值