当前位置: 首页 > 图文教程 > 数据库 > MSSQL > SELECT查询的应用(三)

MSSQL
SQL Server 2000之日志传送功能 - 描述(1)
SQL Server 2000之日志传送功能 - 描述(2)
小议MSSQL Server 2000的安全及管理
关于值班管理的存储过程
根据进程号获取该进程所在客户端的ip地址
在业务系统中处理小数精度, 四舍五入,全舍弃,全进位的方法
利用数据库复制技术 实现数据同步更新
如何将数据库中被锁表解锁
SQLServer 2005安装及界面截图,新增功能
sql server锁机制
SQL Server 2000之日志传送功能 - 问题解决
SQL Server 2000之日志传送功能 - 设定(1)
SQL Server 2000之日志传送功能 - 设定(2)
SQL Server 2000之日志传送功能 - 设定(3)
Sql Server实用操作小技巧集合(一)
Sql Server实用操作小技巧集合(二)
Sql Server实用操作小技巧集合(三)
SQL Server提升权限相关命令及防范
SQL数据操作基础(初级)1
SQL数据操作基础(初级)2

MSSQL 中的 SELECT查询的应用(三)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 90 ::
收藏到网摘: n/a

  分类汇总
  结构化查询(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 |
+-----------+----------+-----------+

所有客户和所售货物两项相同的记录汇总到一起来求平均,就形成了售给不同客户的每一种货物售出的平均价格。