- 爱易网页
 
                        - 
                            数据库教程
 
                        - SELECT查询的运用(三) 
 
                         
                    
                    
                    日期:2013-06-23  浏览次数:20810 次 
                    
                        
                        
            分类汇总 
  结构化查询(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 | 
+-----------+----------+-----------+ 
所有客户和所售货物两项相反的记录汇总到一同来求平均,就构成了售给不同客户的每一种货物售出的平均价格。 
            
                        
                     
                    
                    
                        免责声明: 本文仅代表作者个人观点,与爱易网无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。