来自事务表的聚合数据用于迷你图

时间:2013-10-02 13:04:52

标签: sql ruby-on-rails-3 activerecord

我正在开发一个包含列表类型报告的Ruby-on-Rails应用程序。该表中的两列是来自事务表的聚合。

所以我们假设我们有这两个表:

**items**
id
name
group
price

**transactions**
id
item_id
type
date
qty

这两个表与事务表中的item_id相关联。

现在我想在表格的items表格中显示一些行,并在该表格中有两个计算列:

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

过去12个月中type =“actuals”项目的交易的迷你图。数据库的结果应该是每个月用逗号分隔的汇总数量的文本。例: 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类型解决方案。

1 个答案:

答案 0 :(得分: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过滤器放入子查询节省时间。