group by:对查询的数据按照某一类型进行分组, group by 一般用在order by子句之前,where子句之后
order by:对查询的数据进行某一类进行排序 或 对分组后的数据进行排序
having:对分组后的数据进行条件过滤
继续以上一章创建的客户表为例,表名: customer ,表有列: cus_id,cus_no,cus_name,cus_age,cus_adds。
eg:查询客户的基本信息,以id进行分组: select cus_id,count(*) as num from customer group by cus_id num表示对应的cus_id有多少客户数据, 查询结果如下
如果分组的列中有null值,那么null将作为一个分组返回,如果有多个行都为null值,它们将会被分为一组返回。 group by 必须用在where子句之后,order by子句之前。
除group by可以进行分组过滤数据外,having也可以进行过滤分组;having过滤和where类似,唯一区别在于where是过滤行,而having是过滤分组,可看以下列子:
eg: 查询以id分组后数据总量两条以上的数据: select cus_id,count(*) as num from customer group by cus_id having count(*) >= '2'满足条件的就只有一条数据
order by主要用于数据排序的情况,当查询数据量较大时,有序的数据会让人更好地直观观察数据,order by 关键字用于对结果集按照一个列或者多个列进行排序。此外order by 关键字默认按照升序对记录进行排序。如果需要按照降序对记录进行排序,您可以使用 DESC 关键字。使用方法如下
eg:查询客户的基本信息,以年龄进行排序,默认升序:select * from customer order by cus_age
eg:查询客户的基本信息,以年龄进行排序,降序方式排序:select * from customer order by cus_age DESC
升序使用ASC,降序使用DESC,系统默认为升序。注意两者之间的差异
当对多个列进行排序时,order by使用方法如下:
order by A,B --过滤数据都是默认按升序排列
order by A desc,B --过滤数据时 A 降序,B 升序排列
order by A ,B desc --过滤数据时 A 升序,B 降序排列
desc 或者 asc 只对它紧跟着的第一个列名有效,其他不受影响,仍然是默认的升序。
本小节介绍排序分组就到这里了,通过多分组排序的介绍,知道了group by,order by,having三者之间的差异和区别,大家可以在自己电脑多编写几个脚本,深入了解三个关键字的使用。
Finereport中有一个自定义分组-分组报表可以解决这个需求:
1. 问题描述
通常情况下,数据是通过某一字段来进行分组,如日期字段,每个日期对应一个组,此时分组过于详细,希望按照年与周来分组显示。如下图:
数据库中存的是年月日格式的日期,如何按照年与周来进行分组呢?
2. 示例
2.1 新建报表,添加数据集
新建工作薄,添加数据集ds1,SQL语句为SELECT * FROM 订单。
2.2 表样设计
如下图制作报表,将字段拖拽至对应单元格,运货费数据设置为汇总>求和:
2.3 自定义公式分组
订购日期按“年”分组
选择A2单元格中的订购日期数据列,数据设置修改为分组>高级,点击后面的自定义按钮,d出自定义分组对话框,选择公式分组。
让该订购日期字段按照“年”来分组,如下图:
订购日期按“周”分组
选择B2单元格的订购日期数据列,数据设置修改为分组>高级,点击后面的自定义按钮,d出自定义分组对话框,选择公式分组。
让该订购日期字段按照“周”来分组,如下图:
3. 保存并预览
保存模板,最终效果如上图。
1.根据where条件,order by 排序,数据库查询limit条(可多于limit条)数据2.让程序来做分组筛选
3.程序做分组的同时,判断是否达到limit的数量需求
4.达到limit条数的,结束程序分组筛选
4.小于limit条数的,修改where条件,再次从步骤1开始
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)