28圈.com

GROUP BY与SUM函数搭配使用的主题技巧,,,,,从此握别汇总数据时的各类疑难杂症

GROUP BY与SUM函数搭配使用的主题技巧,,,,,从此握别汇总数据时的各类疑难杂症

先说结论:GROUP BY和SUM这对组合,,,,,是SQL里做数据汇总最常用的搭档,,,,,但好多人用起来总是差那么点意思。 。。。 。。。今天直接讲透。 。。。 。。。

第一步,,,,,搞明显GROUP BY到底在干嘛

GROUP BY的性质,,,,,就是把一堆杂乱无章的纪录,,,,,依照你指定的劣装归堆”。 。。。 。。。好比你有一张销售表,,,,,里面有日期、地域、销售员、金额。 。。。 。。。你想知路每个地域卖了几多,,,,,那就按“地域」剽个字段归堆,,,,,每个地域造成一堆,,,,,而后对每一堆里的金额做汇总。 。。。 。。。

这就像你把一大筐水果依照苹果、橘子、香蕉分隔摆,,,,,而后别离数一数每种有几多个。 。。。 。。。单一吧????????但好多人栽在第一步:SELECT里出现的列,,,,,要么呈此刻GROUP BY里,,,,,要么被聚合函数包着,,,,,没有第三条路。 。。。 。。。这条文则是铁律,,,,,别跟数据库讨价还价。 。。。 。。。

第二步,,,,,SUM的正确打开方式

SUM就是对每一堆里的数值列求和。 。。。 。。。把稳,,,,,它只能对数致粪型的列使用,,,,,你拿它去求和字符串,,,,,数据库会直接报错给你看。 。。。 。。。

看个现实例子。 。。。 。。。如果你要按月份统计每个月的总销售额:

```sql

SELECT

DATE_FORMAT(order_date, '%Y-%m') AS month,

SUM(amount) AS total_amount

FROM orders

GROUP BY DATE_FORMAT(order_date, '%Y-%m');

```

这里有两个关键点。 。。。 。。。第一,,,,,GROUP BY后面跟的是DATE_FORMAT的表白式,,,,,不是单一的列名,,,,,这时辰SELECT里也要写如出一辙的表白式,,,,,不能直接写order_date列名。 。。。 。。。第二,,,,,SUM(amount)是对每个月份分组内的所有订单金额逐一相加。 。。。 。。。

第三步,,,,,GROUP BY和SUM共同的进阶场景

你以为就这么单一????????那你就太幼看这对组合了。 。。。 。。。真正让人头疼的是多列分组和前提聚合。 。。。 。。。

多列分组很单一,,,,,就是在GROUP BY后面跟上多个字段。 。。。 。。。好比按“地域+产品类别”一路分组,,,,,统计每种产品在每个地域的销量。 。。。 。。。

前提聚合稍微绕一点。 。。。 。。。好比你想统计每个地域“金额大于1000的订单”的总金额,,,,,怎么写????????

```sql

SELECT

region,

SUM(CASE WHEN amount > 1000 THEN amount ELSE 0 END) AS big_order_total

FROM orders

GROUP BY region;

```

看见没????????用CASE WHEN把前提嵌进SUM里面,,,,,这样只对满足前提的行求和。 。。。 。。。

第四步,,,,,GROUP BY和SUM的常见坑

说一个最常见的坑,,,,,就是分组字段没选对。 。。。 。。。好比你想统计每个销售员的业绩,,,,,按销售员ID分组没问题。 。。。 。。。但若是你手滑按“销售员姓名”分组,,,,,而系统里有两个同名但分歧ID的人,,,,,那他们俩的业绩就会被归并在一路。 。。。 。。。

另一个坑跟NULL值有关。 。。。 。。。GROUP BY会把所有NULL值归到统一组里,,,,,而SUM函数会自动忽略NULL值。 。。。 。。。这意味着,,,,,若是你某个月的订单金额满是NULL,,,,,SUM的了局是NULL而不是0,,,,,这在报内外看起来就是一片空缺,,,,,容易让人误会。 。。。 。。。

还有一个坑,,,,,好多人会忽略。 。。。 。。。当你的数据量很大,,,,,或者分组字段没建索引时,,,,,GROUP BY查问会变得极度慢。 。。。 。。。这时辰要么给分组字段加索引,,,,,要么思考用覆盖索引优化查问效能。 。。。 。。。

第五步,,,,,跟其他聚合函数一路用

GROUP BY不只是跟SUM搭配,,,,,它还能和COUNT、AVG、MAX、MIN一路工作。 。。。 。。。现实利用中,,,,,一条SQL里时时同时出现好几个聚合函数。 。。。 。。。

```sql

SELECT

category,

COUNT(*) AS order_count,

SUM(amount) AS total_amount,

AVG(amount) AS avg_amount

FROM orders

GROUP BY category;

```

这样一次查问,,,,,就能同时拿到每个品类的订单数、总金额和均匀金额,,,,,效能极度高。 。。。 。。。

最后说一个好多人不知路的点。 。。。 。。。GROUP BY和DISTINCT某些场景下能够相互代替,,,,,但语义齐全分歧。 。。。 。。。DISTINCT只管去沉,,,,,不做聚合推算 ;; ;;;;;GROUP BY是分组+聚合。 。。。 。。。你要是只想看去沉后的值,,,,,用DISTINCT ;; ;;;;;你要是想对每组数据做统计,,,,,必须用GROUP BY。 。。。 。。。

GROUP BY和SUM的用法,,,,,主题就这些。 。。。 。。。上手练几遍,,,,,遇到问题多看看报错信息,,,,,根基就稳了。 。。。 。。。你此刻就去试试,,,,,把你的订单数据按维度拆开来看看,,,,,说不定能发现一些平时把稳不到的业务法规。 。。。 。。。

[责任编纂:刘洋]

为您推荐

热点文章

杰出视频

凤凰资讯官方微信
凤凰资讯官方微信
关注更多资讯
【网站地图】【sitemap】