最近做一个项目中碰到一个这样的问题:
业务数据保存的表如下:订单主表,订单明细表,订单备货表,订单到货表,结算金额表;(实际上还有一套历史记录表)
其中订单备货表就是订单明细表,用不同的字段表示备货信息,并且有一个备货日期字段。
现在要实现的是,按项目,按销售卖方企业,买方企业做维度来分组统计。需要得到的报表如下:
项目名称 订购金额 备货金额 到货金额 结算金额
项目A 10,000 8,000 8,000 7,000
......
查询条件为: 项目:______________ 买方企业:____________ 卖方企业:___________
日期:_______到_______
这看起来很容易实现,一般用户也很自然的会需要出这样的报表。
但是细看起来,不是很容易出这个报表,因为订购金额,备货金额,到货金额,结算金额这些关键的数据在不同的表中,查询条件日期关联的字段也是不一样的。
所以我的设计方案如下:
建立 按项目,买方企业,卖方企业,和日期(去掉时间)为维度的一个统计表,这个统计表中包含的字段有
项目
买方企业
卖方企业
日期
订购金额
备货金额
到货金额
结算金额
然后订购金额从 订单明细表,group by项目,买方企业,卖方企业,订购日期(日期用trunc(日期)去掉时间)得出订货结果集
备货从订单明细表,也是group by项目,买方企业,卖方企业,备货日期 得到备货结果集
到货从到货表 group by 出来 得到到货结果集
结算从结算的表中group by 出来 得到结算结果集
将上述4个结果集union在一起,同时输出 项目,买方,卖方,日期,订购金额,备货金额, 到货金额, 结算金额 这些列,每个结果集中没有的列用0补上。形成一个包含所有数据的结果集,再对这个结果集做分类汇总,再用insert into XXX() select * from ()的语句插入到建立好的统计表中,备查询用。
因为数据量比较大,所以最好还是建立好统计表,将这些生成结果的写成脚本,让数据库每天晚上定时执行,将业务数据分类汇总到统计表中。第二天用户只查询这些统计表,速度不会受到影响;
但是有个问题就是,查询的数据不包含当天的,不能实时反应当时的汇总数据。
其实这个报表的查询还帯有一些子查询,就是对具体买方企业,卖方企业,交易商品明细等等的查询,我的设计思路跟这个主表的类似,就不再细究。