系统城装机大师 - 固镇县祥瑞电脑科技销售部宣传站!

当前位置:首页 > 数据库 > Mysql > 详细页面

mysql滑动订单问题原理与解决方法实例分析

时间:2019-12-29来源:系统城作者:电脑系统城

本文实例讲述了mysql滑动订单问题原理与解决方法。分享给大家供大家参考,具体如下:

先根据以下代码来创建表MonthlyOrders并导入一定的数据


 
  1. CREATE TABLE MonthlyOrders(
  2. ordermonth DATE,
  3. ordernum INT UNSIGNED,
  4. PRIMARY KEY (ordermonth)
  5. );
  6.  

 
  1. INSERT INTO MonthlyOrders SELECT '2010-02-01',23;
  2. INSERT INTO MonthlyOrders SELECT '2010-03-01',26;
  3. INSERT INTO MonthlyOrders SELECT '2010-04-01',24;
  4. INSERT INTO MonthlyOrders SELECT '2010-05-01',27;
  5. INSERT INTO MonthlyOrders SELECT '2010-06-01',26;
  6. INSERT INTO MonthlyOrders SELECT '2010-07-01',32;
  7. INSERT INTO MonthlyOrders SELECT '2010-08-01',34;
  8. INSERT INTO MonthlyOrders SELECT '2010-09-01',30;
  9. INSERT INTO MonthlyOrders SELECT '2010-10-01',31;
  10. INSERT INTO MonthlyOrders SELECT '2010-11-01',32;
  11. INSERT INTO MonthlyOrders SELECT '2010-12-01',33;
  12. INSERT INTO MonthlyOrders SELECT '2011-01-01',31;
  13. INSERT INTO MonthlyOrders SELECT '2011-02-01',34;
  14. INSERT INTO MonthlyOrders SELECT '2011-03-01',34;
  15. INSERT INTO MonthlyOrders SELECT '2011-04-01',38;
  16. INSERT INTO MonthlyOrders SELECT '2011-05-01',39;
  17. INSERT INTO MonthlyOrders SELECT '2011-06-01',35;
  18. INSERT INTO MonthlyOrders SELECT '2011-07-01',49;
  19. INSERT INTO MonthlyOrders SELECT '2011-08-01',56;
  20. INSERT INTO MonthlyOrders SELECT '2011-09-01',55;
  21. INSERT INTO MonthlyOrders SELECT '2011-10-01',74;
  22. INSERT INTO MonthlyOrders SELECT '2011-11-01',75;
  23. INSERT INTO MonthlyOrders SELECT '2011-12-01',14;
  24.  

滑动订单问题是指为每个月返回上一年度(季度或月度)的滑动订单数,即每个月份N,返回N-11到月份N的订单总数。这里,假设月份序列中不存在间断。

执行下面的SQL查询实现每个月返回上一年度的滑动订单总数


 
  1. SELECT
  2. DATE_FORMAT(a.ordermonth, '%Y%m') AS frommonth,
  3. DATE_FORMAT(b.ordermonth, '%Y%m') AS tomonth,
  4. SUM(c.ordernum) AS orders
  5. FROM monthlyorders a
  6. INNER JOIN monthlyorders b
  7. ON DATE_ADD(a.ordermonth, INTERVAL 11 MONTH) = b.ordermonth
  8. INNER JOIN monthlyorders c
  9. ON c.ordermonth BETWEEN a.ordermonth AND b.ordermonth
  10. GROUP BY a.ordermonth,b.ordermonth;
  11.  

运行结果如下图

该查询首先对MonthlyOrders表进行自连接。a表用做下边界(frommonth),b表用做上边界(tomonth)。连接的条件为:


 
  1. DATE_ADD(a.ordermonth, INTERVAL 11 MONTH) = b.ordermonth
  2.  

例如,a表中的2010年2月将匹配2011年1月。

完成自连接之后,需要对订单进行统计。这时需要再进行一次自连接,得到范围内每个月的订单数量。因此连接的条件为


 
  1. c.ordermonth BETWEEN a.ordermonth AND b.ordermonth
  2.  

基于上述方法,我们还可以统计每个季度订单的情况,以此作为和同比增长的比较依据。


 
  1. SELECT
  2. DATE_FORMAT(a.ordermonth, '%Y%m') AS frommonth,
  3. DATE_FORMAT(b.ordermonth, '%Y%m') AS tomonth,
  4. SUM(c.ordernum) AS orders
  5. FROM monthlyorders a
  6. INNER JOIN monthlyorders b
  7. ON DATE_ADD(a.ordermonth, INTERVAL 2 MONTH) = b.ordermonth
  8. AND MONTH(a.ordermonth) % 3 = 1
  9. INNER JOIN monthlyorders c
  10. ON c.ordermonth BETWEEN a.ordermonth AND b.ordermonth
  11. GROUP BY a.ordermonth,b.ordermonth;
  12.  

运行结果如下图

更多关于MySQL相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库锁相关技巧汇总》

希望本文所述对大家MySQL数据库计有所帮助。

分享到:

相关信息

  • MySQL的核心查询语句详解

    一、单表查询 1、排序 2、聚合函数 3、分组 4、limit 二、SQL约束 1、主键约束 2、非空约束 3、唯一约束 4、外键约束 5、默认值 三、多表查询 1、内连接 1)隐式内连接: 2)显式内连接: 2、外连接 1)左外连接 2)右外连接 四...

    2023-10-30

  • Mysql中如何删除表重复数据

    Mysql删除表重复数据 表里存在唯一主键 没有主键时删除重复数据 Mysql删除表中重复数据并保留一条 准备一张表 用的是mysql8 大家自行更改 创建表并添加四条相同的数据...

    2023-10-30

系统教程栏目

栏目热门教程

人气教程排行

站长推荐

热门系统下载