2011-01-27 119 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)