2013-10-02 30 views
1

我正在研究包含列表类型的报告的Ruby-on-Rails应用程序。该表中的两列是来自事务表的汇总。来自事务处理表的汇总数据

所以我们可以说,我们有这两个表:

**items** 
id 
name 
group 
price 

**transactions** 
id 
item_id 
type 
date 
qty 

这两个表与在交易表ITEM_ID连接。

现在我想展示一些设置在一个表中的项目表中的行,并有该表中的两个计算列:

计算列1(迷你图数据):

迷你图进行交易对于过去12个月中类型为“实际”的项目。来自数据库的结果应该是以逗号分隔的每个月的汇总数量的文本。例如: 15,20,0,12,44,33,6,4,33,23,11,65

计算列2(6米总销售):

该项目总数量乘以过去6个月的销售额。

那么结果会怎样想这些列:

Item name - Sparkline data - 6m total sale 

所以结果可以通过线的几千,但可能会被寻呼。

所以问题是,如何在Rails模型中做到这一点并不会牺牲很多性能的最直接的方法?虽然这是一个ruby-on-rails问题,它可能包含更多的sql类型解决方案。

回答

0

在核心SQL可能是类似的东西:

select 
     i.id, 
     i.name, 
     y.sparkline, 
     i.price*s.sum totalsale6m 
from 
     items i left join 
     (select 
       x.item_id, 
       GROUP_CONCAT(x.sumqtd order by datemonth asc SEPARATOR ',') sparkline 
     from 
       (select 
         t.item_id, 
         date_format(date, '%m') datemonth, 
         sum(qtd) sumqtd 
       from 
         transactions t 
       where 
         t.type='actuals' and 
         t.date>date_sub(now(), interval 1 year) 
       group by 
         t.item_id, datemonth 
       ) x 
     group by 
       x.item_id 
     ) y on i.id=y.item_id 
     left join 
     (select 
       t.item_id, 
       sum(qtd) sumqtd 
     from 
       transactions t 
     where 
       t.date>date_sub(now(), interval 6 month) 
     group by 
       t.item_id 
     ) s on i.id=s.item_id 
group by 
     i.id, i.name 

几点意见:

  • 我无法测试它没有真正的数据。
  • 如果在销售中存在差距,我的意思是在某个月没有销售,那么该列表将不包含12个元素。在这种情况下,您需要调整x,y表格
  • 如果您只需要给定几个项目的结果,那么您可能会将项目id筛选器更深入地放入子查询中,从而节省时间。
+0

谢谢。肯定会有很多非销售月份。调整x,y表的含义是什么?点nr。 3关于把item id过滤器更深我不明白。 – gugguson

+0

你应该用连续的月份列表外部连接内部表格。如果你有一个包含连续日期的表,你可以使用它作为日期生成器,否则你必须在这个链接的答案中使用类似的东西:http://stackoverflow.com/questions/14105018/generating-a-series-of-日期 id过滤:如果您只需要一个项目的结果,您可以将t.item_id ='thisid'添加到内部x表格的定义中。 –