Помогите с запросом данных из Rails - PullRequest
4 голосов
/ 27 января 2011

У меня есть три таблицы Lot, Sale и Company.Ниже я приложил биграмму.

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 Google Chart. Поскольку нельзя использовать SUM внутри GROUP_CONCAT в SQLite, мне пришлось использовать это нечеткое встроенное представление.)

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 для извлечения данных.Может кто-нибудь показать мне, как я могу получить эти данные, используя ORM-метод Rails?

Я пытался быть как можно более подробным.Приношу свои извинения за упущения, если таковые имеются.

Спасибо

Найден способ объединить два запроса.

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;

Ответы [ 2 ]

1 голос
/ 02 февраля 2011

Я сделал это с помощью метода 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)
0 голосов
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...