2011-01-27 154 views
4

我有三個表Lot,SaleCompany。我附上了一個digram。幫助查詢來自Rails的數據

enter image description here

我需要獲取的結果集,從這些表10個項目。我正在尋找以下字段 - company_name,平均數量,最高價格,最低價格 的平均價格,銷售數量。我設法查詢他們是這樣的:

SELECT company_id 
    , AVG(quantity) 
    , MAX(price) 
    , MIN(price) 
    , AVG(price) 
    , COUNT(sale_id) 
    FROM lots 
GROUP 
    BY company_id 
ORDER 
    BY AVG(quantity) ASC 
LIMIT 10; 

我還需要平均每單位價格由公司和週數分組。 (我需要這是一個逗號分隔的方式,這樣我可以把它傳遞給谷歌圖表API。由於SQLite的一個GROUP_CONCAT內一個不能使用SUM,我不得不用這個的fugly聯視圖。)

SELECT company_id 
    , GROUP_CONCAT(price_per_unit) 
    FROM (
     SELECT company_id 
      , sales.week 
      , SUM(price * quantity)/SUM(quantity) AS price_per_unit 
      FROM lots 
      JOIN sales 
      ON lots.sale_id = sales.id 
     GROUP 
      BY company_id 
      , sales.week 
     ORDER 
      BY company_id ASC 
      , sales.week ASC 
    ) 
GROUP 
    BY company_id; 

來自SQL背景,我發現有點難以使用ORM模型來獲取數據。有人能告訴我如何使用Rails ORM方式獲取這些數據嗎?

我試過儘可能詳細。如果有的話,我對此表示歉意。

謝謝

找到了一種方法來加入這兩個查詢。

SELECT lots.company_id 
    , AVG(quantity) 
    , MAX(price) 
    , MIN(price) 
    , AVG(price) 
    , COUNT(sale_id) 
    , x.price_per_unit 
    FROM lots 
    JOIN 
    (
     SELECT company_id 
      , GROUP_CONCAT(price_per_unit) AS price_per_unit 
     FROM (
       SELECT company_id 
        , sales.week 
        , SUM(price * quantity)/SUM(quantity) AS price_per_unit 
       FROM lots 
       JOIN sales 
        ON lots.sale_id = sales.id 
       GROUP 
        BY company_id 
        , sales.week 
       ORDER 
        BY sales.week ASC 
      ) 
     GROUP 
      BY company_id 
    ) x 
    ON lots.company_id = x.company_id 
GROUP 
    BY lots.company_id 
ORDER 
    BY AVG(quantity) ASC 
LIMIT 10; 

回答

1

我使用find_by_sql方法來實現這一點。它似乎比其他任何東西都更易於管理。

這裏有一個片段:

 sql = <<EOS 
     SELECT lots.company_id 
      , AVG(quantity) AS avg_quantity 
      , MAX(price) AS max_price 
      , MIN(price) AS min_prices 
      , AVG(price) AS avg_price 
      , COUNT(sale_id) AS cnt_sales 
      , x.price_per_unit 
     FROM lots 
     JOIN 
      (
      SELECT company_id 
       , GROUP_CONCAT(price_per_unit) AS price_per_unit 
       FROM (
        SELECT company_id 
         , sales.week 
         , SUM(price * quantity)/SUM(quantity) AS price_per_unit 
         FROM lots 
         JOIN sales 
         ON lots.sale_id = sales.id 
        GROUP 
         BY company_id 
         , sales.week 
        ORDER 
         BY sales.week ASC 
       ) 
      GROUP 
       BY company_id 
      ) x 
      ON lots.company_id = x.company_id 
     GROUP 
      BY lots.company_id 
     ORDER 
      BY AVG(quantity) ASC 
     LIMIT 10 
EOS 

     @items = Lot.find_by_sql(sql)