作为统计的第三part, 主要还是分享一个统计需求。
初始数据的表结构如下,其中每一条数据是已经统计好的汇总数据,但是每个平台各占一条,导致我们在列表页显示一天内每个平台的汇总数据时还要再做一次处理。
CREATE TABLE `platform_order_sum_day` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`platform` varchar(20) DEFAULT NULL COMMENT '平台',
`happen_date` date NOT NULL COMMENT '发生日期(中国时间)',
`order_num` int(11) DEFAULT NULL COMMENT '订单数量',
`amount` float(14,2) DEFAULT NULL COMMENT '金额',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_platform_happenDate` (`platform`,`happen_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='平台每日订单统计';
结合页面上需要分页操作,需要再生成个汇总的表,于是直接在代码逻辑中处理这个分页操作。
在分页的sql中我们可以顺便去查汇总的总数和汇总的金额、订单数,sql语句如下:
SELECT happen_date, SUM(order_num) AS 'sum_order_num', SUM(amount) AS 'sum_amount', SUM(shop_num) AS 'sum_shop_num', FROM platform_order_sum_day WHERE happen_date BETWEEN ? AND ? GROUP BY happen_date ORDER BY happen_date DESC;
得出按分页获得的每一天的汇总数据,接下来就可以补充每一天的数据,即每一天不同平台的数据,sql语句如下:
SELECT platform, happen_date, order_num, amount, shop_num, puid_num FROM platform_order_sum_day WHERE happen_date BETWEEN ? and ? group by happen_date, platform order by happen_date desc;
这里业务上的代码为:
// 获取分页数据
Page page = platformOrderSumDayDao.getPlatformOrderSumDayStatPage(happenDate, endTime, pageSize, pageNo);
// 获取每一天不同平台的数据
List<Map<String, Object>> allList = platformOrderSumDayDao.listPlatformOrderSumDayStat(happenDate, endTime, pageSize, pageNo);
// 获取每一天的汇总数据
List<Map<String, Object>> sumList = allOrderSumDao.listOrderSumDayStat(happenDate, endTime, pageSize, pageNo);
// 拼接成每一天不同平台的数据
Map<String, List<Map<String, Object>>> happenMap = Maps.newHashMap();
// put进每一天不同平台的数据
for (Map<String, Object> map : allList) {
String happenDateStr = DateUtil.dateToStrNoTime((Date) map.get("happen_date"));
if (!happenMap.containsKey(happenDateStr)) {
happenMap.put(happenDateStr, Lists.newArrayList(map));
} else {
happenMap.get(happenDateStr).add(map);
}
}
将表中多个有关联的数据使用map的key相同进行汇总来处理。
这里的处理逻辑主要是将表中多个有关联的数据使用map的key相同进行汇总来处理。这样就可以通过传递的分页参数和查询条件正确的展示每一天每个平台的汇总数据了。
今天主要是分享这些,谢谢大家!