在本教程中,您将学习如何使用oracle group by
子句将行记录分组。
group by
子句在select语句中用于按行或表达式的值将行组合到分组汇总的行中。 group by
子句为每个分组返回一行。
group by
子句通常与avg()
,count()
,max()
,min()
和sum()
之类的集合函数一起使用。 在这种情况下,聚合函数返回每个分组的摘要信息。 例如,给定几个类别的产品,avg()
函数返回每个类别中产品的平均价格。
以下说明了oracle group by
子句的语法:
select
column_list
from
t
group by
c1,
c2,
c3;
group by
子句出现在from
子句之后。在有提供where子句的情况下,group by
子句必须放在where
子句之前。
group by
子句按分组列中的值(如c1
,c2
和c3
)对行进行分组。group by
子句只能包含聚合或分组的列。
如果要指定应该一次计算的多个分组级别,请使用以下rollup
语法:
select
column_list
from
t
group by
rollup(c1,c2,c3);
我们将在示例数据库中使用以下orders
和order_items
表进行演示:
以下语句使用group by
子句在orders
表中查找唯一的订单状态:
select
status
from
orders
group by
status;
执行上面查询语句,得到以下结果 -
该语句与使用distinct运算符的以下语句具有相同的效果:
select
distinct status
from
orders;
以下语句返回客户的订单数量:
select
customer_id, count( order_id )
from
orders
group by
customer_id
order by
customer_id;
执行上面查询语句,得到以下结果 -
在这个例子中,我们按客户编号来分组订单,并使用count()
函数返回每个组的订单数量。
要获得更有意义的数据,可以按以下方式将orders
表与customers
表一起连接:
select
name, count( order_id )
from
orders
inner join customers
using(customer_id)
group by
name
order by
name;
执行上面查询语句,得到以下结果 -
以下示例按年份对订单进行分组,并返回每年订单的数量。参考以下查询语句 -
select
extract(year from order_date) year,
count( order_id )
from
orders
group by
extract(year from order_date)
order by
year;
执行上面查询语句,得到以下结果 -
在这个例子中,我们使用extract()
函数从订单的日期中获取年份信息。
与前面的例子不同,这里使用了一个在group by
子句中返回年份的表达式。
以下语句计算销售额并按customer_id
,status
和(customer_id
,status
)对其进行分组:
select
customer_id,
status,
sum( quantity * unit_price ) sales
from
orders
inner join order_items
using(order_id)
group by
rollup(
customer_id,
status
);
执行上面查询语句,得到以下结果 -
在本教程中,您已学习如何使用oracle group by
子句将行记录分组。