【问题标题】:Help with querying data from Rails帮助从 Rails 查询数据
【发布时间】:2011-01-27 12:35:17
【问题描述】:

我有三个表LotSaleCompany。我在下面附上了一个图表。

我需要从这些表中获取包含 10 个项目的结果集。我正在寻找以下字段——公司名称、平均数量、最高价格、最低价格 平均价格,销售数量。我设法像这样查询它们:

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;

我还需要按公司和周数分组的平均单价。 (我需要以逗号分隔的方式将其传递给 Google Chart API。由于不能在 SQLite 中的 GROUP_CONCAT 中使用 SUM,因此我不得不使用这个丑陋的内联视图。)

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;

【问题讨论】:

    标签: ruby-on-rails-3 activerecord


    【解决方案1】:

    我通过使用find_by_sql 方法实现了这一点。它似乎比其他任何东西都更易于管理。

    这是一个sn-p:

          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)
    

    【讨论】:

      【解决方案2】: