2013-10-02 33 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表格的定義中。 –