SQL乐园(25)

软件世界

  在很多时候,数据表中有很多数据需要按照一定的规则重新组合在一起。比如计算一个商店一个月内某件商品的总销售额时,需要把每天的销售额加在一起。根据我们以前学的知识,用WHERE子句可以实现这个功能,但是确定的条件一次只能对一种商品进行操作,非常麻烦。

  引例

  假设有下面的数据表Products,字段组成为:TradeNo(交易号)、ProductsID(商品编号)和TradeSum(交易额)。要统计每种商品的交易额时,我们可以这样做:

  SELECT ProductsID, TradeSum FROM Products WHERE ProductsID=0031

  SELECT ProductsID, TradeSum FROM Products WHERE ProductsID=0045

  ……

  TradeNo ProductsID Price TradeSum

  1 0031 12 1200

  2 0045 14 784

  可以看到这样做的结果是:有多少种ProductsID,就要执行多少次SELECT语句,非常不便。其实,这里要用的功能是分组,我们可以用下面的语句来实现:

  SELECT ProductsID, SUM(TradeSum) FROM Products GROUP BY ProductsID

  GROUP BY子句就是分组子句,它根据某个列把数据表中数据进行分组,在实际应用中这是一种非常有用的语句。

  应用进阶

  如果要在计算每种商品销售额的同时计算销售量,我们应该怎么办呢?很简单,这需执行下面的语句:

  SELECT ProductsID, SUM(TradeSum),SUM(TradeSum)/SUM(Price) FROM Products GROUP BY ProductsID

  下面笔者进行另一个实验:列出每种商品的产品编号、销售额和价格。很多朋友看到这里肯定不假思索就得到了答案:

  SELECT ProductsID, SUM(TradeSum),Price FROM Prod ucts GROUP BY Prod uctsID

  但是,当你执行这条语句时就会发现,该语句有问题,不能执行。原因是:在SELECT语句中列出的字段必须也出现在GROUP BY子句中。也就是说,要达到上面的目的,只须执行:SELECT ProductsID, SUM(TradeSum),Price FROM Products GROUP BY ProductsID,Price

  如果朋友们查看程序员写的SQL代码就会发现,他们有时会将GROUP BY子句与ORDER BY子句联合使用。这样做的好处是能使GROUP BY子句得到的没有顺序的数据拥有一个特定的顺序。(贵州 王伟)

  预告:下期我们一起来认识HAVING语句。

  上期问题:在Northwind数据库“order details”表中,找出ProductID为2的商品的产品编号、订单编号和每份订单数额在该商品订单总额中的比例。

  参考答案:select A.productID,A.OrderID,A.SalesofOrder/B.Sales AS Per from (

  (select productID,OrderID,UnitPrice*Quantity AS SalesofOrder FROM “order details” WHERE ProductID=2) AS A

  CROSS JOIN

  (select SUM(UnitPrice*Quantity) AS Sales FROM “order details” WHERE Pro ductID=2 ) AS B)

  本期问题:按销售量(注意,不是销售额)列出Products表中每种商品的Prod uctsID(商品编号)和销售额。

  本期的幸运读者是山东的刘洁,她将获得《数码摄像全接触》一本。请朋友们在答题的E-mail中注明通讯地址,以便邮寄奖品。