获取按12周时间分组的数据

时间:2015-11-30 08:22:07

标签: mysql

我有一张包含订单数据的表格:

CREATE TABLE `orders` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL DEFAULT '0',
  `price` decimal(6,3) unsigned NOT NULL,
  `created` datetime DEFAULT NULL,
  `paid` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

我需要在12周时间内获得订单的价格总和,其中第一个期间从支付第一个订单的一周开始,并且每个下一个期间比之前的一个周期开始一周(这有可能比较数据12周时间)。所以最终必须有像1-12,2-13等等的时期。

重要细节:我无法在查询中使用变量,因为此查询将在BI工具中使用,其中带有变量的查询会出现意外情况。

1 个答案:

答案 0 :(得分:0)

下一步做到了:

SELECT `periods`.*, SUM(`orders`.`price`) AS `revenue`
FROM (SELECT DISTINCT FROM_DAYS(TO_DAYS(`paid`) - MOD(TO_DAYS(`paid`) -1, 7)) AS `period_start`,
      (FROM_DAYS(TO_DAYS(`paid`) - MOD(TO_DAYS(`paid`) -1, 7)) + INTERVAL 12 WEEK) AS `period_end`
      FROM `orders`
) AS `periods`
LEFT JOIN `orders` ON DATE(`orders`.`paid`) BETWEEN `periods`.`period_start` AND `periods`.`period_end`
GROUP BY `periods`.`period_end`

小解释:首先,我使用相同的表数据在子查询中定义12周的句点。通过这样做

DISTINCT FROM_DAYS(TO_DAYS(`paid`) - MOD(TO_DAYS(`paid`) -1, 7))

我将付费价值转移到周初。

有了这个

(FROM_DAYS(TO_DAYS(`paid`) - MOD(TO_DAYS(`paid`) -1, 7)) + INTERVAL 12 WEEK)

我添加12周的日期意味着一周的开始。

最终我得到这样的结果:

| period_start | period_end |
| 2015-07-19   | 2015-10-11 |
| 2015-07-26   | 2015-10-18 |

然后我只是在句号结束时加入订单表和组数据。

看起来它能满足我的需求。