1

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

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

**items**
id
name
group
price

**transactions**
id
item_id
type
date
qty

这两个表与 transactions 表中的 item_id 相连。

现在我想在一个表的项目表中显示一组行,并在该表中有两个计算列:

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

过去 12 个月 type="actuals" 的项目交易的迷你图。来自数据库的结果应该是包含每个月的汇总数量的文本,以逗号分隔。示例:15,20,0,12,44,33,6,4,33,23,11,65

计算的第 2 列(总销售额 600 万):

商品的总数量乘以过去 6 个月的销售额。

所以结果将如何列如下:

Item name - Sparkline data - 6m total sale

所以结果可能有数千行,但可能会被分页。

所以问题是,在不牺牲太多性能的 Rails 模型中,最直接的方法是什么?尽管这是一个 ruby​​-on-rails 问题,但它可能包含更多的 sql 类型解决方案。

4

1 回答 1

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 过滤器更深入地放入子查询中以节省时间。
于 2013-10-06T14:33:25.230 回答