SQL分类汇总 实例
|
admin
2010年7月3日 16:5
本文热度 6172
|
结构化查询(sql)的另一个强大的功能是分类汇总,也就是group子句;mysql当然也提供这个功能。现在还以我在《select查询的应用(二)join子句的用法》中的数据库为例说说group子句的用法。
一、查询每个客户的交易次数。count()是一个与group子句一起使用的函数,它的作用是计数:
select customer,count(*) as sale_count from sales group by customer
返回的查询可能结果为:
+----------+------------+
| customer | sale_count |
+----------+------------+
| 1 | 1 |
+----------+------------+
| 2 | 1 |
+----------+------------+
表示了代码为1和2的两个客户分别有一次交易。
二、查询每个客户的交易总额。sum()是一个与group子句一起使用的函数,它的作用是求和:
select customer,sum(price*amount) as total_price from sales group by customer
返回的查询结果可能为:
+----------+-------------+
| customer | total_price |
+----------+-------------+
| 1 | 12000.00 |
+----------+-------------+
| 2 | 12000.00 |
+----------+-------------+
表示了代码为1和2的两个客户各有12000元的交易额。其中sum(price*amount)表示先将price和amount即单价和数量相乘后再求和,亦即总价。
三、查询每个客户的平均每次交易额。avg()是求平均值的函数:
select customer,avg(price*amount) as avg_price from sales group by customer
返回的查询结果可能为:
+----------+-----------+
| customer | avg_price |
+----------+-----------+
| 1 | 12000.00 |
+----------+-----------+
| 2 | 12000.00 |
+----------+-----------+
表示了代码为1和2的两个客户的平均每次交易的交易额都是12000元。由于我预设的数据量比较小,查询的结果不甚明显,请读者谅解。可以随意向sales表中添加一些数据,数据量越大,结果越明显。
四、查询每个客户最大的和最小的一笔成交额。max()和min()函数分别是取最大值和最小值的函数:
select customer,max(price*amount) as max_price,min(price*amount) as min_price from sales group by customer
返回的查询结果可能为:
+----------+-----------+-----------+
| customer | max_price | min_price |
+----------+-----------+-----------+
| 1 | 12000.00 | 12000.00 |
+----------+-----------+-----------+
| 2 | 12000.00 | 12000.00 |
+----------+-----------+-----------+
五、查询每一种货物售出的平均价格。
select good_code,avg(price) as avg_price from sales group by good_code
对么?不对!这样查询到的是每种货物各条销售记录中价格的平均值,并不是实际售出的所有该货物的平均价格;对我们来说,有用的是按照销售数量加权平均的价格:
select good_code,sum(price*amount)/sum(amount) as avg_price from sales group by good_code
返回的查询结果可能为:
+-----------+-----------+
| good_code | avg_price |
+-----------+-----------+
| a0001 | 1200.00 |
+-----------+-----------+
六、查询售给不同客户的每一种货物售出的平均价格。只要在group子句中多加一个关键字:
select good_code,customer,sum(price*amount)/sum(amount) as avg_price from sales group by good_code,customer
返回的查询结果可能为:
+-----------+----------+-----------+
| good_code | customer | avg_price |
+-----------+----------+-----------+
| a0001 | 1 | 1200.00 |
+-----------+----------+-----------+
| a0001 | 2 | 1200.00 |
+-----------+----------+-----------+
所有客户和所售货物两项相同的记录汇总到一起来求平均,就形成了售给不同客户的每一种货物售出的平均价格。
按月统计:select convert(char(7),createtime,20) as time,sum(price*amount) as hits from sales
group by convert(char(7),createtime,20)
该文章在 2010/7/3 16:05:50 编辑过