今天主要介绍MySQL累计聚合的原理及使用方法。接下来我们来看一下~累计聚合累计聚合就是对序列中第一个元素到当前元素的数据进行聚合,比如返回每个员工从每个月初到现在的累计订货量和平均订货量.行号问题有两种解决方案,使用子查询和使用连接。子查询方法通常更直观和可读。但是当调用聚合时,子查询需要为每个聚合扫描一次数据,而连接方法通常只需要扫描一次就可以得到结果。以下查询使用连接来获取结果SELECTa.empid,a.ordermonth,a.qtyASthismonth,SUM(b.qty)AStotal,CAST(AVG(b.qty)ASDECIMAL(5,2))ASavgFROMempordersaINNERJOINempordersbONa.empid=b.empidANDb.ordermonth<=a.ordermonthGROUPBYa.empid,a.ordermonth,a.qtyORDERBYa.empid,a.ordermonth如果只查询2015年的累计订单,可以加上where条件WHEREDATE_FORMAT(a.ordermonth,'%Y')='2015'ANDDATE_FORMAT(b.ordermonth,'%Y')='2015'运行结果如下另外,数据可能还需要过滤,比如只显示每个员工到达某个月之前的月订单需要返回某个目标。这里假设统计每个员工的总订单数量达到1000之前的累计情况。这里可以使用HAVING过滤器完成查询SELECTa.empid,a.ordermonth,a.qtyASthismonth,SUM(b.qty)AStotal,CAST(AVG(b.qty)ASDECIMAL(5,2))ASavgFROMempordersaINNERJOINempordersbONa.empid=b.empidANDb.ordermonth<=a.ordermonthWHEREDATE_FORMAT(a.ordermonth,'%Y')='2015'ANDDATE_FORMAT(b.ordermonth,'%Y')='2015'GROUPBYa.empid,a.ordermonth,a.qtyHAVINGtotal<1000ORDERBYa.empid,a.ordermonth没有统计到1000的那个月的情况,如果要统计的话,情况有点复杂。如果指定total<=1000,则当月订单数量恰好为1000时才统计,否则当月不统计。所以,这个问题的过滤可以从另外一个方面来考虑。累计订单小于1000时,累计订单与上月订单差值小于1000,第一个月订单大于1000也可统计。因此,解决方案的SQL语句如下:SELECTa.empid,a.ordermonth,a.qtyASthismonth,SUM(b.qty)AStotal,CAST(AVG(b.qty)ASDECIMAL(5,2))ASavgFROMempordersaINNERJOINempordersbONa.empid=b.empidANDb.ordermonth<=a.ordermonthWHEREDATE_FORMAT(a.ordermonth,'%Y')='2015'ANDDATE_FORMAT(b.ordermonth,'%Y')='2015'GROUPBYa.empid,a.ordermonth,a.qtyHAVINGtotal-a。qty<1000ORDERBYa.empid,a.ordermonth运行结果如下如果只想返回当月累计订单数为1000的数据,而不返回上月的数据,可以进一步过滤上面的SQL语句,然后加上累计订单数大于等于1000的条件。本题SQL语句如下,SELECTa.empid,a.ordermonth,a.qtyASthismonth,SUM(b.qty)AStotal,CAST(AVG(b.qty)ASDECIMAL(5,2))ASavgFROMempordersaINNERJOINempordersbONa.empid=b.empidANDb。ordermonth<=a.ordermonthWHEREDATE_FORMAT(a.ordermonth,'%Y')='2015'ANDDATE_FORMAT(b.ordermonth,'%Y')='2015'GROUPBYa.empid,a.ordermonth,a.qtyHAVINGtotal-a.qty<1000ANDtotal>=1000ORDERBYa.empid,a.ordermonth运行结果如下
