group by该如何理解

山书生 2009-09-07 03:17:57
一直不太明白Group By的用处。虽然书上说:Group By子句用于对结果集进行分组。但是还是不清楚它有何用途?!


key1 key2
3 5
4 17

不知道group by用于什么情况下,后者什么情况时候要用到呢。
...全文
242 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
y3174 2009-09-11
  • 打赏
  • 举报
回复
资料不错 学习了
山书生 2009-09-11
  • 打赏
  • 举报
回复
太强大了,各位!
--
向达人们致敬!
dg831451 2009-09-08
  • 打赏
  • 举报
回复
收藏了。也学习了。这里真的太强大了。
believe_me 2009-09-07
  • 打赏
  • 举报
回复
学习一下
gudujianxiao 2009-09-07
  • 打赏
  • 举报
回复
学习一下!
bkln81 2009-09-07
  • 打赏
  • 举报
回复
学习一下
ljm2008 2009-09-07
  • 打赏
  • 举报
回复
group by是对相同类的分到一个组中
然后进行汇总统计
huaxuit 2009-09-07
  • 打赏
  • 举报
回复
学习一下。
  • 打赏
  • 举报
回复
多上网站查查资料,自然就明白了
mbh0210 2009-09-07
  • 打赏
  • 举报
回复
Group By是对相同的分组进行统计汇总
我家有奥特曼 2009-09-07
  • 打赏
  • 举报
回复
group by 分组统计用
zhangjiang264 2009-09-07
  • 打赏
  • 举报
回复
grup by 就是过滤之后进行分组,group by后面的每组记录纸都不一样的
--小F-- 2009-09-07
  • 打赏
  • 举报
回复
指定用来放置输出行的组。如果 SELECT 子句 <select list> 中包含聚合函数,则 GROUP BY 将计算每组的汇总值。指定 GROUP BY 时,选择列表中任意非聚合表达式内的所有列都应包含在 GROUP BY 列表中,或者 GROUP BY 表达式必须与选择列表表达式完全匹配。

注意:
如果未指定 ORDER BY 子句,则使用 GROUP BY 子句返回的组没有任何特定的顺序。若要指定特定的数据排序,建议您始终使用 ORDER BY 子句。



Transact-SQL 语法约定

语法

[ GROUP BY [ ALL ] group_by_expression [ ,...n ]
[ WITH { CUBE | ROLLUP } ]
]


参数
ALL

包含所有组和结果集,甚至包含那些其中任何行都不满足 WHERE 子句指定的搜索条件的组和结果集。如果指定了 ALL,将对组中不满足搜索条件的汇总列返回空值。不能用 CUBE 或 ROLLUP 运算符指定 ALL。

如果在访问远程表的查询中还有 WHERE 子句,则该查询不支持 GROUP BY ALL。

group_by_expression

进行分组所依据的表达式。group_by_expression 也称为组合列。group_by expression 可以是列,也可以是引用由 FROM 子句返回的列的非聚合表达式。不能使用在选择列表中定义的列别名来指定组合列。

注意:
不能在 group_by_expression 中使用类型为 text、ntext 和 image 的列。



对于不包含 CUBE 或 ROLLUP 的 GROUP BY 子句,group_by_expression 的项数受查询所涉及的 GROUP BY 列的大小、聚合列和聚合值的限制。该限制从 8,060 字节的限制开始,对保存中间查询结果所需的中间级工作表有 8,060 字节的限制。如果指定了 CUBE 或 ROLLUP,则最多只能有 10 个分组表达式。

不能直接在 group_by_expression 中指定 xml 数据类型方法。相反,可引用内部使用 xml 数据类型方法的用户定义函数,或引用使用这些数据类型方法的计算列。

CUBE

指定在结果集内不仅包含由 GROUP BY 提供的行,还包含汇总行。GROUP BY 汇总行针对每个可能的组和子组组合在结果集内返回。GROUP BY 汇总行在结果中显示为 NULL,但用来表示所有值。使用 GROUPING 函数可确定结果集内的空值是否为 GROUP BY 汇总值。

结果集内的汇总行数取决于 GROUP BY 子句内包含的列数。GROUP BY 子句中的每个操作数(列)绑定在分组 NULL 下,并且分组适用于所有其他操作数(列)。由于 CUBE 返回每个可能的组和子组组合,因此不论在列分组时指定使用什么顺序,行数都相同。

ROLLUP

指定在结果集内不仅包含由 GROUP BY 提供的行,还包含汇总行。按层次结构顺序,从组内的最低级别到最高级别汇总组。组的层次结构取决于列分组时指定使用的顺序。更改列分组的顺序会影响在结果集内生成的行数。

重要事项:
使用 CUBE 或 ROLLUP 时,不支持区分聚合,如 AVG(DISTINCT column_name)、COUNT(DISTINCT column_name) 和 SUM(DISTINCT column_name)。如果使用这类聚合,则 Microsoft SQL Server 2005 Database Engine 将返回错误消息并取消查询。



示例
A. 使用简单 GROUP BY 子句
以下示例检索 SalesOrderDetail 表中各 SalesOrderID 的总数。

复制代码
USE AdventureWorks ;
GO
SELECT SalesOrderID, SUM(LineTotal) AS SubTotal
FROM Sales.SalesOrderDetail sod
GROUP BY SalesOrderID
ORDER BY SalesOrderID ;


B. 将 GROUP BY 子句用于多个表
以下示例检索与 Employee 表联接的 Address 表中的各 City 的雇员数。

复制代码
USE AdventureWorks ;
GO
SELECT a.City, COUNT(e.AddressID) EmployeeCount
FROM HumanResources.Employee e
INNER JOIN Person.Address a
ON e.AddressID = a.AddressID
GROUP BY a.City
ORDER BY a.City ;



li1229363 2009-09-07
  • 打赏
  • 举报
回复
学习~~
华夏小卒 2009-09-07
  • 打赏
  • 举报
回复

select 班级,count(*)as 人数 from tb
group by 班级

对班级进行分组,统计每个班有多少人

---结果如:

班级 人数
---- ----
班级1 49
班级2 43
班级3 39

xuejiecn 2009-09-07
  • 打赏
  • 举报
回复
对group by后列值相同的行中的所有值进行统计。
如求和,平均值,最大,最小等。
soft_wsx 2009-09-07
  • 打赏
  • 举报
回复
select 姓名,sum(分数) as 分数 from tb group by 姓名
按姓名分组求每个人的总分数
select 姓名,科目,sum(分数) as 分数 from tb group by 姓名,科目
按姓名及科目分组求每个人每个科目的分数
soft_wsx 2009-09-07
  • 打赏
  • 举报
回复


select 姓名,sum(分数) as 分数 from tb group by 姓名
按姓名分组求每个人的总分数
ws_hgo 2009-09-07
  • 打赏
  • 举报
回复
统计-->分组
加载更多回复(3)

34,592

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧