2011-01-27 17 views
4

私は3つのテーブルLot,SaleおよびCompanyを持っています。私は下に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; 

私はまた、会社と週番号をグループ化した平均単価が必要でした。 (私はGoogleのチャートAPIに渡すことができるように、私は、カンマ区切りの方法としてこれを必要とする。SQLiteの中GROUP_CONCAT内側に1つのカント使用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の方法でどのようにフェッチできるかを教えてもらえますか?

私は可能な限り冗長にしようとしました。私の不作為に対する謝罪。

ありがとう

2つのクエリを結合する方法が見つかりました。

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) 
関連する問題