我是第一次做报表,需要统计的是日/周/月订单数、用户活跃数等,x轴基本单位为日期(日/周/月)。
现在是统计的报表肯定是一个连续的日期段,比如1月1号到1月30号,统计的是最近30天的数据,而数据库里订单表里只有下单日期和创建日期,日期可能不连续,即当天下单为0。我现在的思路是要有一个基本的连续的日期,统计的时候是只gourp by  下单时间,一种是在后端生成一个到当前日期的连续日期数组,和mysql 查询返回的集合做对比,没有的日期赋值为0。另一种是在数据库生成连续日期表,再联合查询,但这个我没试过。我现在的思路就是这两种,但我想了解下在报表这方面做过这种日期统计的你们的思路是什么,哪种会好些。

解决方案 »

  1.   


    你的思路不错。实际上对于这种报表,就是先生成一个 固定的日期序列,以这个为主,然后join上业务数据,然后计算出来的
      

  2.   


    同意,之前做报表时使用第二种比较多(不过是oracle中)
      

  3.   


    你说的是在数据库生成日期表吗?如果这样的话,一般是生成一个固定的日期段,比如30年的这种,还是说在查询的时候生成到当前日期的那种表。最后是直接用join就好了么?
      

  4.   


    你说的是在数据库生成日期表吗?如果这样的话,一般是生成一个固定的日期段,比如30年的这种,还是说在查询的时候生成到当前日期的那种表。最后是直接用join就好了么?可以生成到当前日期的这种,然后再查询的时候 用时间查询条件过滤需要的日期,然后再join
      

  5.   


    你说的是在数据库生成日期表吗?如果这样的话,一般是生成一个固定的日期段,比如30年的这种,还是说在查询的时候生成到当前日期的那种表。最后是直接用join就好了么?可以生成到当前日期的这种,然后再查询的时候 用时间查询条件过滤需要的日期,然后再join生成固定日期的sql定义了参数,然后也筛选出了我需要的数据,怎么和这个固定日期的sql join 在一起呢,需要写视图么?
      

  6.   


    你说的是在数据库生成日期表吗?如果这样的话,一般是生成一个固定的日期段,比如30年的这种,还是说在查询的时候生成到当前日期的那种表。最后是直接用join就好了么?可以生成到当前日期的这种,然后再查询的时候 用时间查询条件过滤需要的日期,然后再join生成固定日期的sql定义了参数,然后也筛选出了我需要的数据,怎么和这个固定日期的sql join 在一起呢,需要写视图么?这样:select
    from temp_date t
    left join tb 
    on tb.日期 = t.日期
      

  7.   


    你说的是在数据库生成日期表吗?如果这样的话,一般是生成一个固定的日期段,比如30年的这种,还是说在查询的时候生成到当前日期的那种表。最后是直接用join就好了么?可以生成到当前日期的这种,然后再查询的时候 用时间查询条件过滤需要的日期,然后再join生成固定日期的sql定义了参数,然后也筛选出了我需要的数据,怎么和这个固定日期的sql join 在一起呢,需要写视图么?这样:select
    from temp_date t
    left join tb 
    on tb.日期 = t.日期哦,left join我是想到了。不过你看看我生成日期的这个sql,也是参考网上的 ..set @days = timestampdiff(day,'2015-11-04',date(now()));
    set @d = -1;select @d :=@d+1 as id,adddate('2015-11-04',@d) as t
    from b2b_orders
    where @d<@days 
    ;然后,统计的sql。。select date(xx) date,count(id) count from orders where ....group by date(order_date)这两个需要怎么连接
      

  8.   


    你说的是在数据库生成日期表吗?如果这样的话,一般是生成一个固定的日期段,比如30年的这种,还是说在查询的时候生成到当前日期的那种表。最后是直接用join就好了么?可以生成到当前日期的这种,然后再查询的时候 用时间查询条件过滤需要的日期,然后再join生成固定日期的sql定义了参数,然后也筛选出了我需要的数据,怎么和这个固定日期的sql join 在一起呢,需要写视图么?这样:select
    from temp_date t
    left join tb 
    on tb.日期 = t.日期哦,left join我是想到了。不过你看看我生成日期的这个sql,也是参考网上的 ..set @days = timestampdiff(day,'2015-11-04',date(now()));
    set @d = -1;select @d :=@d+1 as id,adddate('2015-11-04',@d) as t
    from b2b_orders
    where @d<@days 
    ;然后,统计的sql。。select date(xx) date,count(id) count from orders where ....group by date(order_date)这两个需要怎么连接先把产生的日期数据放到一个临时表里,然后再关联。
      

  9.   


    也可以直接关联的,如:select
    from 
    (
    select ... from xxx
    )a
    left join order b
    on ...
      

  10.   


    有一个问题,就是由于我生成的那个到当前日期的sql 如果直接关联统计sql的话因为存在变量,放在后台程序里会报错。现在想问的是如果如果弄成临时表,怎么和统计的sql 连接,并且是每天查询这个临时日期表都是生成到当前的。
      

  11.   


    有一个问题,就是由于我生成的那个到当前日期的sql 如果直接关联统计sql的话因为存在变量,放在后台程序里会报错。现在想问的是如果如果弄成临时表,怎么和统计的sql 连接,并且是每天查询这个临时日期表都是生成到当前的。
    也可以做成普通的表,先把日期数据都生成了,比如可以从2010年到2030年的数据都生成了,这样直接传入参数就可以直接过滤表的。临时表,由于他的特性,会自动删除里面的数据,所以一般在存储过程里用
      

  12.   


    有一个问题,就是由于我生成的那个到当前日期的sql 如果直接关联统计sql的话因为存在变量,放在后台程序里会报错。现在想问的是如果如果弄成临时表,怎么和统计的sql 连接,并且是每天查询这个临时日期表都是生成到当前的。
    也可以做成普通的表,先把日期数据都生成了,比如可以从2010年到2030年的数据都生成了,这样直接传入参数就可以直接过滤表的。临时表,由于他的特性,会自动删除里面的数据,所以一般在存储过程里用我现在就是用存储过程跑了一个统计表,已经能达到我想要的效果,就是查询的时候才生成到当前日期。现在还没考虑性能这些,不过数据量也不大,一次就取30天的。