说明:group by是sql中对数据表中的数据进行分组的,在select列表中出现的字段必须全部出现在group by 字段中,出现在聚合函数中的字段在group by中可有可无,没有出现在select列表中的字段在group by中也可以使用。在group by中不可以使用列别名。
语法:select column_name,aggregate_function(column_name) from table_name where column_name operator value group by column_name
(1)分组计算数据
a.本实例利用sum()函数和group by计算图书销售表(Booksales)中图书的总销售额
select b_code,sum(b_price) from Booksales group by b_code
b.本实例利用avg()函数和group by 计算学生表信息(studenttable) 中男生和女生的平均年龄
select studentsex,avg(studentage) from studenttable group by studentsex
c.本实例利用max()函数和group by 计算学生信息表(studenttable)中男生和女生的最大年龄
select studentsex,max(studentage) from studenttable group by studentsex
d.本实例利用min()函数和group by 计算学生信息表(studenttable)中男生和女生的最小年龄
select studentsex,min(studentage) from studenttable group by studentsex
(2)group by and all
说明:本实例中利用了group by子句和all关键字,在group by 子句中使用all关键字,只有在sql语句中包含where子句时,all才有意义。
a. 查询图书销售表(Booksales)中图书编号为1100010101的图书销售总额,且列出其他图书编号
Select b_code,sum(sal_tot) from Booksales where b_code=’1100010101’ group by all b_code
(3) ROLLUP的使用
说明:ROLLUP关键字是用来生成小计的,利用了with rollup关键字会在结果集的最后显示的行名称为空,而后面对应的值则为计算列的所有值!
a. 利用sum()和with rollup对学生信息表(studenttable)中的所有年龄生成小计
Select studentsex,sum(studentage) from studenttable group by [studentsex] with rollup
b. 利用max()和with rollup 对学生信息表(studenttable) 中的年龄最大值生成小计
Select studentsex,max(studentage) from studenttable group by [studentsex] with rollup
c.利用min()和with rollup对学生信息表(studenttable)中的年龄最小值生成小计
select studentsex,min(studentage) from studenttable group by [studentsex] with rollup
d. 利用avg()和with rollup 对学生表(studenttable)中的年龄平均值生成小计
Select studentsex,avg(studentage) from studenttable group by [studentsex] with rollup
e. 利用count()和with rollup对学生表(studenttable)中的记录数生成小计
Select studentsex,count(*) from studenttable group by [studentsex] with rollup
注意:
当with rollup与sum()一起使用时得出的结果是分组后每组的和的和
当with rollup与max()一起使用时得出的结果是分组后组的较大值
当with rollup与min()一起使用时得出的结果是分组后组的较小值
当with rollup与avg()一起使用时得出的结果是所以记录的平均值
当with rollup与count()一起使用时得出的结果是分组后各组数量的总和
(4)CUBE的使用
说明:CUBE用来生成小计和总计交叉表,group by 分组后由CUBE生成总计和小计!
a. 利用sum()和CUBE对图书销售表(Booksales)中的销售额生成小计和总计
Select b_code,b_number,sum(sal_tot) from Booksales group by b_code,b_number with cube
b. 利用max()和CUBE对图书销售表(Booksales)中的销售额生成小计和总计
Select b_code,b_number,max(sal_tot) from Booksales group by b_code,b_number with cube
c. 利用min()和CUBE对图书销售表(Booksales)中的销售额生成小计和总计
Select b_code,b_number,min(sal_tot) from Booksales group by b_code,b_number with cube
d. 利用avg()和cube对图书销售表(Booksales)中的销售额生成小计和总计
Select b_code,b_number,avg(sal_tot) from Booksales group by b_code,b_number with cube
e. 利用count()和cube对图书销售表(Booksales)中的销售额生成小计和总计
Select b_code,b_number,count(*)from Booksales group by b_code,b_number with cube
(5)where与having的使用
说明:where子句是对select语句的结果进行筛选,having子句则是对group by子句进行筛选,having子句通常和group by子句一起使用,如果不使用group by子句,则having子句的行为和where子句的行为一样,当having和group by all一起使用时,having子句代替all,在having子句中不能使用text,image和ntext类型,where子句是在进行分组之前应用,而having子句则是在分组后应用,having子句可以包含聚合函数,也可以引用选择列表中出现的任何选项,也可以应用group by中的任何选项,having也可引用没有出现在select列表的而出现在group by列表的字段。
a. 使用group by与having查询图书销售表(Booksales)中图书销售额大于200的图书编号和销售额
Select b_code,sum(b_price) from Booksales group by b_code having sum(p_price)> 200
b. 使用group by 与having查询图书销售表(Booksales)中图书销售记录大于2条的图书编号和销售额
Select b_code,sum(b_price) from Booksales group by b_code having count(*)>2
c. 使用group by与having查询销售数量大于2并且销售额大于50的图书编号和销售额按销售额降序
Select b_code,sum(b_price) from Booksales where b_number>2 group by b_code having sum(b_price)>50 order by sum(b_price) desc
d. 使用group by与having查询联系方式表(contact)中年龄不为20的id号
select id from contact group by id,ages having ages not in (20)
(6)compute与compute by的使用方法
说明:compute是对聚合函数生成小计的,一个select语句中可以有多个compute指定的聚合函数,注意在compute子句的聚合函数中不可以使用列别名,compute输出的结果为两行,
第一行:生成select_list列表中行的明细
第二行:compute子句中聚合函数的小计
Compute by 则是先实现分组然后统计compute子句中聚合函数小计的,在compute by语句中必须要有order by排序并且排序列和by分组列必须相同
第一行:生成select_list列表中行的明细
第二行:compute子句中聚合函数的小计
两个都是输出compute子句中聚合函数的小计,但是不相同的是compute输出的是聚合列在表中的所有值,而compute by 则是输出先按by子句中的字段分组以后每组的聚合列的值!
a. 查询图书销售表(Booksales)中的总销售额,销售个数
Select * from Booksales compute sum(sal_tot),sum(b_number)
b. 查询图书销售表(Booksales)中的销售额最小和最大并按图书编号升序排列
Select * from Booksales order by b_code compute max(sal_tot),min(sal_tot)
c. 查询图书销售表(Booksales)中的总销售额,销售个数按b_code分组
select * from Booksales order by b_code compute sum(sal_tot),sum(b_number) by b_code

(7)group by 和 compute by 的比较
说明:group by与compute by都可以进行分组,但是他们有一定的区别
Group by :生成单个结果集,每一行都只有分组依据列和聚合列,选择列表也只能包含分组依据列和聚合列,可排序也可不排序,如果要排序的话只能先分组后排序,排序列必须和分组列相同或者是分组列的子集或者为聚合函数产生的新列,聚合函数写在select列表中,在group by 子句中不可以使用聚合函数、在聚合函数聚合结果中可以使用列别名。
Compute by:生成多个结果集,一种结果集包括选择列表中的行的明细,另一种结果集则包含聚合以后的小计,在compute by 子句中必须排序,并且排序列必须和compute by的中分组列相同,聚合函数写在compute子句中,分组列写在by子句中,分组列可以是表中的任意列,但不可以使用列别名,在聚合函数聚合结果中不可以使用列别名。

sql server 分组统计数据的更多相关文章

  1. CASE函数 sql server——分组查询(方法和思想) ref和out 一般处理程序结合反射技术统一执行客户端请求 遍历查询结果集,update数据 HBuilder设置APP状态栏

    CASE函数   作用: 可以将查询结果集的某一列的字段值进行替换 它可以生成一个新列 相当于switch...case和 if..else 使用语法: case 表达式/字段 when 值 then ...

  2. SQL Server 分组后取Top N

    SQL Server 分组后取Top N(转) 近日,工作中突遇一需求:将一数据表分组,而后取出每组内按一定规则排列的前N条数据.乍想来,这本是寻常查询,无甚难处.可提笔写来,终究是困住了笔者好一会儿 ...

  3. c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程

    c#Winform程序调用app.config文件配置数据库连接字符串 你新建winform项目的时候,会有一个app.config的配置文件,写在里面的<connectionStrings n ...

  4. Sql Server系列:数据表操作

    表是用来存储数据和操作数据的逻辑结构,用来组织和存储数据,关系数据库中的所有数据都表现为表的形式,数据表由行和列组成.SQL Server中的数据表分为临时表和永久表,临时表存储在tempdb系统数据 ...

  5. 一个有趣的SQL Server 层级汇总数据问题

        看SQL Server大V宋大侠的博客文章,发现了一个有趣的sql server层级汇总数据问题.          具体的问题如下:     parent_id emp_id emp_nam ...

  6. sql server 随机读取数据

    --sql server 随机读取数据 * FROM [tablename] ORDER BY NEWID() pk from [tablename] ORDER BY NEWID()) --这两个方 ...

  7. sql server 与oracle数据互导的一种思路--sql server链接服务器

    思路:通过在sql server数据库中添加链接服务器,可以远程查询oracle数据库的表环境准备,安装sql server数据库,并安装好oracle驱动,在配置好tnsname文件中配置好orac ...

  8. 如何用asp.net MVC框架、highChart库从sql server数据库获取数据动态生成柱状图

    如何用asp.net MVC框架.highChart库从sql server数据库获取数据动态生成柱状图?效果大概是这样的,如图: 请问大侠这个这么实现呢?

  9. 最简单删除SQL Server中所有数据的方法

     最简单删除SQL Server中所有数据的方法 编写人:CC阿爸 2014-3-14 其实删除数据库中数据的方法并不复杂,为什么我还要多此一举呢,一是我这里介绍的是删除数据库的所有数据,因为数据之间 ...

随机推荐

  1. mysql5.7版本无法启动服务问题

    cmd情况下进入mysql的bin目录后 输入命令:mysqld --initialize-insecure d:\mysql\bin

  2. slivelight5和数据库交互

    最近开始研究sliverlight和数据库交互了,无奈网上资料较少,查阅了大量资料终于成功了,但是我记得还有别的方法,希望大家讨论一下 数据访问层我的用的是ado.net实体数据模型 然后新建了一个w ...

  3. jMeter之二

    jMeter应用的最小子集有如下三个概念: 首先是线程组(Thread Group),线程组意味着定义一下多少个线程,多长时间建立起来(模拟增量按照一定频度上扬)以及循环多少次: 第二个是采样器(Sa ...

  4. 【原】jQuery编写插件

    分享一下编写设置和获取颜色的插件,首先我将插件的名字命名为jquery.color.js.该插件用来实现以下两个功能1.设置元素的颜色.2.获取元素的颜色. 先在搭建好如下编写插件的框架: ;(fun ...

  5. 设置UITextField的placeholder的颜色

    [textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];

  6. Steam游戏黑屏与游戏直接安装方法

    黑屏原因主要是360禁止了反作弊进程,解决方法: Steam游戏目录: Steam\steamapps\common\*** 例如黎明杀机,备份时候可直接备份该目录下 Dead by Daylight ...

  7. CF_91B

    题目意思是这样的:给定n个整数,求第i个数右边的距离它最远的比它小的数的下标之差然后再减1. 这里既然是需要知道距离该数最远的下标,可以从右至左扫描一遍,然后按照单调递减的顺序入栈,即只把比栈顶元素小 ...

  8. 【Xamarin挖墙脚系列:如何从一个Apk程序转化为Xamarin的程序】

    原文:[Xamarin挖墙脚系列:如何从一个Apk程序转化为Xamarin的程序] 工欲善其事必先利其器:工具下载:http://pan.baidu.com/s/1skxjwgH 接下来,我用个小的应 ...

  9. Perl脚本学习经验(四)--Perl中sftp的使用

    使用sftp,需要使用Except模块,该模块需要下载安装在perl目录下,可以上http://www.cpan.org/上下载对应的安装包:1. 用root用户登录环境:2. cd /usr/lib ...

  10. WCF中的由于目标计算机积极拒绝,无法连接

    1.第一种情况 百度上找到了这篇文章  http://blog.sina.com.cn/s/blog_6b44b2ba01016j0z.html 讲的是使用了using用完之后就释放了,得到启发,仔细 ...