问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何使用SQL语句,实现多条件分组统计

发布网友 发布时间:2022-04-22 02:38

我来回答

1个回答

热心网友 时间:2023-07-31 16:35

以一种有意义的方式组织数据可能是一项挑战。有时你需要的可能是一个简单的排序,但是通常你需要做更多,你需要分组来进行分析和统计。幸运的是,SQL提供了大量语句和操作来进行排序,分组和摘要。下面的一些技巧将会帮助你识别什么时候排序,什么时候分组,什么时候以及如何统计。对要每条语句和操作的详细信息请查看Books Online。

  1.使用排序使数据有序

  通常,你的所有数据真正需要的仅仅是按某种顺序排列。SQL的ORDER BY语句可以以字母或数字顺序组织数据。因此,相似的值按组排序在一起。然而,这个分组时排序的结果,并不是真的分组。ORDER BY显示每条记录而分组可能代表很多记录。

  2.进行分组除去重复值

  排序和分组之间的区别是:排序的数据显示所有记录(在限定标准范围之内),而分组数据不是显示所有记录。GROUP BY语句对于同样的值只显示一条记录。例如,下面的语句中的GROUP BY语句对数据源中重复出现的数据只返回的zip编码列。

  SELECT ZIP FROM Customers GROUP BY ZIP

  只包括由GROUP BY和SELECT语句共同定义的那些记录,换句话说,SELECT列表必须满足GROUP BY列表,但是有一个例外就是SELECT列表可以包含聚合函数(GROUP BY语句不允许使用聚合函数)。需要注意的是GROUP BY语句不会对结果分组进行排序。为了使分组按字母或数字有序排列,需要添加ORDER BY语句。此外,在GROUP BY语句中不能引用使用了别名的字段。分组栏目必须是潜在的数据,但它们并不需要显示在结果中。

  3.在分组之前进行数据筛选

  你可以添加一个WHERE语句来筛选有GROUP BY所得分组中的数据。例如,下面的语句只返回肯塔基州顾客的ZIP编码列。

  SELECT ZIP FROM CustomersWHEREState = ’KY’ GROUP BY ZIP

  必须注意的是WHERE语句是在GROUP BY语句求值之前进行数据过滤的。与GROUP BY语句一样,WHERE语句也不支持聚合函数。

  4.返回所有分组

  当你使用WHERE语句过滤数据时,结果分组中只显示你指定的那些记录,而符合分组定义但是不满足过滤条件的数据不会包含在某个分组中。当你想在分组中包含所有数据时添加关键字ALL即可,这时WHERE条件就不起作用。例如,在前面的例子中添加关键字ALL就会返回所有的ZIP分组,而不是仅在肯塔基州的那些。

  SELECT ZIP FROM CustomersWHEREState = ’KY’ GROUP BY ALL ZIP

  这样看来,这两个语句存在冲突,你可能不会以这种方式使用关键字ALL。当你使用聚合函数计算某一列时,使用ALL关键字可能会很方便。例如,下面的语句计算每个肯塔基州ZIP中的顾客数,同时,还会显示其它的ZIP值。

  SELECT ZIP, Count(ZIP) AS KYCustomersByZIP FROM
  CustomersWHEREState = ’KY’ GROUP BY ALL ZIP

  结果分组包括潜在数据中的所有ZIP值,然而,对于那些不是肯塔基州ZIP分组的聚合列(KYCustomersByZIP)将会显示0。远程查询不支持 GROUP BY ALL。

  5.分组后筛选数据

  WHERE语句在GROUP BY语句之前进行计算。当你需要在分组之后筛选数据时,可以使用HAVING语句。通常情况下,WHERE语句和HAVING语句的返回结果是一样的,但是值得注意的是这两个语句不可互换。当你迷惑时,可以遵循下面的说明:使用WHERE语句过滤记录,使用HAVING语句过滤分组。

  一般情况,你会使用HAVING语句和某个聚合函数计算一个分组。例如,下面的语句返回一个的ZIP编码列,但是可能不会包含潜在数据源中所有的ZIP。

  SELECT ZIP, Count(ZIP) AS CustomersByZIP FROM
  Customers GROUP BY ZIP HAVING Count(ZIP) = 1

  只有那些包含一位顾客的分组显示在结果中。

  6.进一步了解WHERE和HAVING语句

  如果你对何时应该使用WHERE,何时使用HAVING仍旧很迷惑,请遵照下面的说明:

  WHERE语句在GROUP BY语句之前;SQL会在分组之前计算WHERE语句。

  HAVING语句在GROUP BY语句之后;SQL会在分组之后计算HAVING语句。

  7.使用聚合函数统计分组数据

  分组数据可以帮助我们分析数据,但是有时我们可能需要更多的信息而不仅仅是分组。你可以使用聚合函数来统计分组数据。例如,下面的语句显示每批订购单的总价钱。

  SELECT OrderID, Sum(Cost * Quantity) AS OrderTotal  FROM Orders GROUP BY OrderID

  对于其它的分组来说,SELECT和GROUP BY列必须匹配。而SELECT语句包含聚合函数时这一规则是一个例外。

  8.统计聚合数据

  你可以继续统计数据为每个分组显示一个分类统计。SQL的ROLLUP操作符可以为每个分组显示一个额外的分类统计。这个分类统计是使用聚合函数计算每个分组中的所有记录得到的结果。下面的语句为每个分组计算OrderTotal:

  SELECT Customer, OrderNumber, Sum(Cost * Quantity)  AS OrderTotal FROM Orders GROUP BY Customer, OrderNumber WITH ROLLUP

  对于有两个分别为20和25 OderTotal值的分组,ROLLUP显示一个OrderTotal值45。ROLLUP结果中的第一条记录是的,因为它是计算所有分组记录,这个值是整个记录集的总值。

  ROLLUP在聚合函数中不支持 DISTINCT,也不支持GROUP BY ALL语句。

  9.统计每个列

  CUBE操作符比ROLLUP更进一步,它返回每个分组中重复值的个数。它的结果和ROLLUP相同,但是对每位客户的每一列CUBE包含一个额外的记录。下面的语句显示每个分组的统计和额外每位客户的统计。

  SELECT Customer, OrderNumber, Sum(Cost * Quantity)  AS OrderTotal FROM Orders GROUP BY Customer,
OrderNumber WITH CUBE

  CUBE可以给最综合的统计。它不仅完成聚合和ROLLUP的功能,还可以计算定义分组的其它列,换句话说,CUBE统计每个可能的列组合。

  CUBE不支持GROUP BY ALL语句。

  10:对统计结果排序

  当CUBE的结果令人迷惑时(它经常是这样),可以添加一个GROUPING函数,如下所示:

  SELECT GROUPING(Customer), OrderNumber, Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP
BY Customer, OrderNumber WITH CUBE

  结果中每行包含两个额外的值:

  值1表示左边的值是一个统计值,是ROLLUP或CUBE的操作符。

  值0表示左边的值是一条由最初的GROUP BY语句产生的详细记录。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
沈阳2套房收取哪些费用 沈阳第二套房子上多少税 家里有一只拆家的二哈怎么办? 23款宝来悦行pro所有按键说明 酱香饼真正的发源地在那里,是从什么时候开始的 根据《建设工程安全生产管理条例》,施工单位主要负责人的安全生产职责不... panda和dad中的a发音一样吗 ...两个字中的拼音"a"发音时最主要的细微差别是什么? ...两个字中的拼音"a"发音时最主要的细微差别是什么? 很急啊啊啊啊... 处在发育期的颧骨,长期按压它会缩小吗 sql语句 怎么分组统计 sql中根据表中一个字段分组如何分别统计每个分组的... sql分组统计 腾讯视频一般什么时候年费会员有优惠 sql语句 如何分组后得到记录总数 为什么淘宝会被限制登录怎么解冻? 淘宝账户被限制登录怎么办,怎么解决? 水果大福怎么做 淘宝怎么会被限制登录呢。 求大福的做法,哪位大神能教我怎么做大福 为什么我的淘宝帐号提示被限制登录了啊! 淘宝账户被限制登录怎么解决? 草莓大福外面包的那层白的是什么东西? 草莓大福应当如何做? 莓大福怎么做? 草莓大福如何做的这么圆 抹茶大福怎么做 抹茶大福是怎么做的? 找草莓大福的做法 抹茶草莓大福怎么做 sql 分组统计 腾讯视频VIP会员的直播特权是什么? 求助 sql server分组统计问题 sql中根据表中一个字段分组分别统计每个分组的记录数 灯罩脏了怎样才能最简洁的把它弄干净? SQL 分组统计怎么能让多个值为一组进行统计 灯罩怎么清洗啊 王卡福利社优惠购腾讯视频VIP会员活动是否有购买限... sql 数据分组统计 支付宝能下载钉钉吗 灯具如何清洗 各类清洁灯具方法及注意事项 SQL 分组统计,再合并组 支付宝怎么绑定钉钉 台灯灯罩怎么清洗 台灯灯罩清洗方法 SQL 分组统计 同字段不同类型数据分别统计 我下载的钉钉在哪里可以找到? 右前大灯灯罩上有些划痕,约0.5mm深,求教去除方法 SQL 分组统计并排序 钉钉怎么绑定支付宝 清洗灯具用什么洗