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中注明通讯地址,以便邮寄奖品。