第6节.分组数据
1.SQL Server Group By语句
Group By 从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。
以下是 Group By 子句的语法:
select
select_list
from
table_name
group by
column_name1,
column_name2 ,...;
在此查询语法中, Group By 子句为列中的每个值组合生成一个组。 请考虑以下示例:
select
customer_id,
year (order_date) order_year
from
sales.orders
where
customer_id in (1, 2)
Group By
customer_id;
在查询中添加一个 Group By 子句来查看效果:
select
customer_id,
year (order_date) order_year
FROM
sales.orders
WHERE
customer_id in (1, 2)
Group By
customer_id,
year (order_date)
order by
customer_id;
2.Group By 子句和聚合函数
Group By 子句通常与聚合函数一起用于统计数据。 聚合函数对组执行计算并返回每个组的唯一值。
例如, count() 函数返回每个组中的行数。 其他常用的聚合函数是: SUM() , AVG() , MIN() , MAX() 。
Group By 子句将行排列成组,聚合函数返回每个组的统计量(总数量,最小值,最大值,平均值,总和等)。
例如,以下查询返回客户按年度下达的订单数:
select
customer_id,
year (order_date) order_year,
count (order_id) 订单数量
from
sales.orders
where
customer_id IN (1, 2)
Group By
customer_id,
year (order_date)
order by
customer_id;
如果要引用 Group By 子句中未列出的任何列或表达式,则必须使用该列作为聚合函数的输入。
否则,数据库系统将会提示错误,因为无法保证列或表达式将为每个组返回单个值。
例如,以下查询将失败:
select
customer_id,
year (order_date) order_year,
order_status
from
sales.orders
where
customer_id IN (1, 2)
Group By
customer_id,
year (order_date)
order by
customer_id;
这是因为 order_status 列未在 Group By子句中
1.带有count()函数示例的Group By子句
以下查询返回每个城市的客户数量:
select
city,
count (customer_id) customer_count
from
sales.customers
Group By
city
order by
city;
2.Group By子句带有MIN和MAX函数示例
以下声明返回所有型号年份为 2018 的最低和最高价产品:
select
brand_name,
min (list_price) min_price,
max (list_price) max_price
from
production.products p
INNER JOIN production.brands b ON b.brand_id = p.brand_id
where
model_year = 2018
Group By
brand_name
order by
brand_name;
3.带有AVG()函数示例的Group By子句
以下语句使用 AVG() 函数返回型号年份为 2018 年的所有产品的平均价格:
select
brand_name,
AVG (list_price) avg_price
from
production.products p
inner join production.brands b on b.brand_id = p.brand_id
where
model_year = 2018
Group By
brand_name
order by
brand_name;
4.带有SUM函数示例的Group By子句
以下查询使用 SUM() 函数获取每个订单的总价值:
select
order_id,
SUM (quantity * list_price ) net_value
from
sales.order_items
group by
order_id;
3.SQL Server Having子句
Having子句通常与[Group By]子句一起使用,以根据指定的条件列表过滤分组。
以下是 Having子句 的语法:
select
select_list
from
table_name
Group By
group_list
Having
conditions;
在此语法中, Group By子句将行汇总为分组, having子句将一个或多个条件应用于这些每个分组。
只有使条件评估为 true的组才会包含在结果中。 换句话说,过滤掉条件评估为 false或 unknown 的 组。
因为SQL Server在Group By子句之后处理 having子句,所以不能通过使用列别名来引用选择列表中指 定的聚合函数。
以下查询将失败:
select
column_name1,
column_name2,
aggregate_function (column_name3) column_alias
FROM
table_name
Group By
column_name1,
column_name2
having
column_alias > value;
必须明确使用 having子句中的聚合函数表达式,如下所示:
select
column_name1,
column_name2,
aggregate_function (column_name3) alias
from
table_name
Group By
column_name1,
column_name2
having
aggregate_function (column_name3) > value;
1.HAVING子句与COUNT函数示例
以下声明查找每年至少下过两个订单的客户:
select
customer_id,
YEAR (order_date),
COUNT (order_id) order_count
from
sales.orders
Group By
customer_id,
YEAR (order_date)
having
count (order_id) >= 2
order by
customer_id;
在上面查询示例中, 首先, Group By子句按客户和订单年份对销售订单进行分组。 count() 函数返回每个客户每年 下达的订单数。 其次, having子句筛选出订单数至少为 2 的所有客户。
2.having子句与SUM()函数的例子
以下语句查找净值大于 20000 的销售订单:
select
order_id,
SUM (quantity * list_price * (1 - discount)) net_value
from
sales.order_items
Group By
order_id
having
SUM (
quantity * list_price * (1 - discount)
) > 20000
order by
net_value;
在这个例子中: 首先, SUM 函数计算销售订单的净值。 其次, having子句过滤净值小于或等于 20000 的销售订单。
3.having子句与MAX和MIN函数的示例
以下语句首先查找每个产品类别中的最大和最小价格。 然后,它筛选出最大价格大于 4000 或最小价格 小于 500 的类别:
select
category_id,
MAX (list_price) max_list_price,
MIN (list_price) min_list_price
from
production.products
Group By
category_id
having
MAX (list_price) > 4000 OR MIN (list_price) < 500;
4.having子句与AVG()函数示例
select
category_id,
AVG (list_price) avg_list_price
from
production.products
Group By
category_id
having
AVG (list_price) between 500 and 1000;
|