(转载)SQL语句中Group by语句的详细介绍
转自:http://blog.163.com/yuer_d/blog/static/76761152201010203719835
| SQL语句中Group by语句的详细介绍 一、创建数据表(表名:Sales) Create table Sales(ID numeric(28,0) identity,InvNo char(8),InvDate datetime default getdate(), Customer varchar(20),Department varchar(5),Amount numeric(10,2)) 二、语法介绍 SELECT [DISTINCT|ALL] {*|模式名.] {表名|视图名| 快照名] .*…| {表达式[列别名]…} } [, [模式名. ] {表名| 视图名|} .*…| 表达式[列别名] ]… FROM [模式名.] {表名|视图名|快照名} [@数据库链名] [表别名] [, [模式名.] {表名|视图名|快照名} [@数据库链名] [表别名] ]… [WHERE条件] [START WITH条件 CONNECT BY 条件] [GROUP BY表达式[,表达式] …[HAVING条件] [WITH CUBE|ROLLUP] [UNION|UNION ALL |INTERSECT|MINUS]SELECT命令 [ORDER BY{表达式|位置} [ASC|DESC] [, {表达式|位置[ASC|DESC]}]…] Group by 表达式[,表达式]……[HAVING条件] [WITH CUBE|ROLLUP]表示分组 1、查询Sales表中,统计各客户的销售额,并按销售额降序排列结果 select customer 客户名称,sum(amount) 销售额 from sales group by customer order by sum(amount) desc 结果如下: Customer Amount 中海集运 1700000 中韩轮渡 1091201 国际海运 22402 氨纶股份 16801.5 Group by按组汇总,所谓组就是完全一致的数据统称为一组,本例主要是按客户名称分组,一组中一致的名称 进行sum求和。 2、查询Sales表中,统计各部门的销售额,并按销售额降序排列结果 select department 部门,sum(amount) 销售额 from sales group by department order by sum(amount) desc 结果如下: Department Amount C 1591201 A 811201 B 411201 D 16801.5 3、查询Sales表中,按部门、客户分组统计销售额,并按客户排列结果 select department 部门,customer 客户 ,sum(amount) 销售额 from sales group by department,customer order by department 这里先按部门分组,然后按客户分组。对于部门相同客户相同的记录进行汇总 结果如下: 部门 客户 销售额 A 氨纶股份 5600.5 A 国际海运 5600.5 A 中海集运 800000 B 氨纶股份 5600.5 B 国际海运 5600.5 B 中海集运 400000 C 氨纶股份 5600.5 C 国际海运 5600.5 C 中韩轮渡 1080000 C 中海集运 500000 D 国际海运 5600.5 D 中韩轮渡 11201 调换Group by分组位置,不影响查询结果,如: select department 部门,customer 客户 ,sum(amount) 销售额 from sales group by customer,department order by department 无论是先按照客户分组,还是先按照部门分组,分组后查询出的结果是一致的,这是因为 对于两个分组,只有部门、客户完全一致的方可汇总。 4、查询Sales表中,统计各客户的销售额,并计算汇总销售额 select customer 客户名称,sum(amount) 销售额 from sales group by customer with cube order by sum(amount) 注意这里的with cube的用法。With cube除了返回由Group by子句指定的列外,还返回按组统计的行。返回的结果先按分组的第一 个条件列排序显示,再按第二个条件列排序显示。统计行包括了Group by子句指定的列的各种组合的数据统计。 此例中,只有一个分组条件,客户名称,由于有with cube则需要返回除了group by指定的列外,还要返回行。 按客户分组,除了每个客户外,还应统计所有客户的销售额,这就是with cube。 结果如下: 客户名称 销售额 氨纶股份 16801.5 国际海运 22402 中韩轮渡 1091201 中海集运 1700000 2830404.5 再例如,求出各部门的销售额,并计算总销售额 select department as 部门,sum(amount) as 销售额 from sales group by department with cube 部门 销售额 A 811201 B 411201 C 1591201 D 16801.5 2830404.5 5、按部门、客户分组统计销售额,并计算各部门总的销售额、分客户销售额和全公司总的销售额 select department 部门,customer 客户 ,sum(amount) 销售额 from sales group by department,customer with cube 结果如下: 部门 客户 销售额 1 A 氨纶股份 5600.5 2 A 国际海运 5600.5 3 A 中海集运 800000 4 A 811201 5 B 氨纶股份 5600.5 6 B 国际海运 5600.5 7 B 中海集运 400000 8 B 411201 9 C 氨纶股份 5600.5 10 C 国际海运 5600.5 11 C 中韩轮渡 1080000 12 C 中海集运 500000 13 C 1591201 14 D 国际海运 5600.5 15 D 中韩轮渡 11201 16 D 16801.5 17 2830404.5 18 氨纶股份 16801.5 19 国际海运 22402 20 中海集运 1700000 21 中韩轮渡 1091201 本例包含了两个分组条件,第一个分组条件为部门,第二个分组条件为客户名称,这里使用了with cube,也就是说 该分组除了返回group by指定的列外,还返回按组统计的行,返回顺序先按照第一个字段显示,然后按照第二个字段 显示。 (1)第1-3行是按照group by子句后department部门、customer客户名称进行分组求和; (2)第4行是按照with cube子句返回第一个字段组合的行。即A客户总的销售额; (3)第5-16行原理同上; (4)第18-21行按照WITH CUBE子句返回第二个字段组合的所有行。即各客户的销售额; (5)第17行所有部门、所有客户总的销售额; 修改GROUP BY子句中字段的顺序 select department 部门,customer 客户 ,sum(amount) 销售额 from sales group by customer,department with cube 部门 客户 销售额 A 氨纶股份 5600.5 B 氨纶股份 5600.5 C 氨纶股份 5600.5 16801.5 A 国际海运 5600.5 B 国际海运 5600.5 C 国际海运 5600.5 D 国际海运 5600.5 22402 A 中海集运 800000 B 中海集运 400000 C 中海集运 500000 1700000 C 中韩轮渡 1080000 D 中韩轮渡 11201 1091201 2830404.5 A 811201 B 411201 C 1591201 D 16801.5 6、按部门、客户分组统计销售额,并计算各部门总的销售额以及全公司总的销售额 select department 部门,customer 客户 ,sum(amount) 销售额 from sales group by department,customer with ROLLUP 结果如下: 部门 客户 销售额 1 A 氨纶股份 5600.5 2 A 国际海运 5600.5 3 A 中海集运 800000 4 A 811201 5 B 氨纶股份 5600.5 6 B 国际海运 5600.5 7 B 中海集运 400000 8 B 411201 9 C 氨纶股份 5600.5 10 C 国际海运 5600.5 11 C 中韩轮渡 1080000 12 C 中海集运 500000 13 C 1591201 14 D 国际海运 5600.5 15 D 中韩轮渡 11201 16 D 16801.5 17 2830404.5 交换group by子句中的字段,改变列的顺序会使返回结果的行数发生变化 select customer 客户,department 部门 ,sum(amount) 销售额 from sales group by customer,department with ROLLUP 客户 部门 销售额 氨纶股份 A 5600.5 氨纶股份 B 5600.5 氨纶股份 C 5600.5 16801.5 国际海运 A 5600.5 国际海运 B 5600.5 国际海运 C 5600.5 国际海运 D 5600.5 22402 中海集运 A 800000 中海集运 B 400000 中海集运 C 500000 1700000 中韩轮渡 C 1080000 中韩轮渡 D 11201 1091201 2830404.5 总结: Group by子句主要功能是分组,分组后可以使用聚合函数sum/avg等,所谓的组 实质就是相同的项目称为组,当Group by中有多个组字段时,按照字段的先后顺序进行 分组统计。当有with cube和with rullop子句时,系统除了按照group by子句进行分组 外,还返回按组统计的行,他们唯一的区别是with rullop统计行时,只按照group by 子句中第一个字段进行分组统计。 另外,Having子句主要是对分组后的数据进行条件过滤,通常发生在where子句之后。 如: select customer 客户名称,sum(amount) 销售额 from sales group by customer having sum(amount)>100000 order by sum(amount) desc 结果如下: 客户名称 销售额 中海集运 1700000 中韩轮渡 1091201 再如: select customer 客户名称,sum(amount) 销售额 from sales where amount>6000 group by customer having sum(amount)>100000 order by sum(amount) desc 结果如下: 客户名称 销售额 中海集运 1700000 中韩轮渡 1080000 该查询首先对Sales进行一次筛选,筛选条件为销售额大于6000,然后再进行分组汇总, 此例中,中韩轮渡有两条记录在数据分组前已经被过滤掉。 |
(转载)SQL语句中Group by语句的详细介绍的更多相关文章
- 转载:Java中的字符串常量池详细介绍
引用自:http://blog.csdn.net/langhong8/article/details/50938041 这篇文章主要介绍了Java中的字符串常量池详细介绍,JVM为了减少字符串对象的重 ...
- MyBatis:SQL语句中的foreach标签的详细介绍
foreach 也就是遍历迭代,在SQL中通常用在 in 这个关键词的后面 foreach元素的属性主要有 item,index,collection,open,separator,close. 分别 ...
- PL/SQL客户端中执行insert语句,插入中文乱码
问题描述:在PL/SQL客户端中执行insert语句,插入中文乱码 解决方案: 1.执行脚本 select userenv('language') from dual; 结果为AMERICAN_ ...
- SQL Server中的流控制语句
begin···end 该语句定义sql代码块,通常在if和while语句中使用 declare @num int ; ; begin ; print 'hello word' end if···el ...
- 九、dbms_ddl(提供了在PL/SQL块中执行DDL语句的方法)
1.概述 作用:提供了在PL/SQL块中执行DDL语句的方法,并且也提供了一些DDL的特殊管理方法. 2.包的组成 1).alter_compile说明:用于重新编译过程.函数和包语法:dbms_dd ...
- 【转】Java中try catch finally语句中含有return语句的执行情况(总结版)
Java中try catch finally语句中含有return语句的执行情况(总结版) 有一点可以肯定,finally块中的内容会先于try中的return语句执行,如果finall语句块中也有r ...
- Java异常处理中finally中的return会覆盖catch语句中的return语句
Java异常处理中finally中的return会覆盖catch语句中的return语句和throw语句,所以Java不建议在finally中使用return语句 此外 finally中的throw语 ...
- SQL Server中解决死锁的新方法介绍
SQL Server中解决死锁的新方法介绍 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的 ...
- QT中PRO文件写法的详细介绍
学习Qt时,发现有些知识看了不经常用就忘了,以下是书本上写的一些关于qmake的相关知识,自己看后,打算把一些经常用到的记下来,整理整理. Qt程序一般使用Qt提供的qmake工具来编译. qmake ...
随机推荐
- paip.oracle query export to insert sql
paip.oracle query export to insert sql 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:/ ...
- HTML6注册表单输入日志标题
一.找到元素. var d = document.getElementById("") var d = document.getElementsByName("" ...
- 在Linux上使用cmake创建CodeBlocks工程
最近在linux上使用cmake,对于使用GUI习惯的还真不能适应,真是想尽一切办法把原来使用cmake的工程创建成CodeBlocks工程.工程小了还能接受,工程大了太麻烦了. 看了一下cmake的 ...
- LVS客户端启动脚本
在设置LVS客户端时,如果我们使用手工设置的话会比较麻烦.现在我们直接使用脚本来启动lvs-client就OK了,下面是一个简单的脚本. VIP地址:10.0.0.230,把文件放到/etc/init ...
- OSX: 10.9的SMB网络共享连接可能破坏其权限设置
参见以前的Blog,“OSX: 10.9 Mavericks的重要更新技术细节(1)”,自从10.9之后,它的内核默认地使用全新的SMB2协议,这本来是令人期待的变化,不过根据这多年来和OS X系统的 ...
- NodeJS学习笔记(一)——搭建开发框架Express,实现Web网站登录验证
JS是脚本语言,脚本语言都需要一个解析器才能运行.对于写在HTML页面里的JS,浏览器充当了解析器的角色.而对于需要独立运行的JS,NodeJS就是一个解析器.每一种解析器都是一个运行环境,不但允许J ...
- IntentService的使用
1.为什么需要IntentService 是LocalService的包装类,简便Service的创建,使用的是startService(),也就是访问者退出Service不会消失. 2.实现原理 步 ...
- iOS在Xcode6中添加空模板
1.在Xcode6.0以下版本找到空模板(路径与下方相同). 2.将空模板拖入路径:Macintosh HD ▸ 应用程序 ▸ Xcode(版本号).app ▸ Contents ▸ Develo ...
- jchat:linux聊天程序2:MySQL
该软件使用的数据库为MySQL,因为它免费.开源,在linux下几乎就是最好的选择. 首先要在mysql中root用户新建数据库并赋权给本用户: create database jchat; gran ...
- [问题解决] LaTex Error:Unknown graphics extension:.eps
错误:编译的时候显示:“!LaTex Error:Unknown graphics extension:.eps” 发生场景:Latex写论文 解决方案: latex eps.texdvi2ps ep ...