2016-10-17 15 views
2

以下のような表があります。SQL加重平均

make | model | engine | cars_checked | avg_mileage 
---------------------------------------|-------- 
suzuki | sx4 | petrol | 11   | 12 
suzuki | sx4 | diesel | 150   | 16 
suzuki | swift | petrol | 140   | 15 
suzuki | swift | diesel | 18   | 19 
toyota | prius | petrol | 16   | 17 
toyota | prius | hybrid | 250   | 24 

所望の出力は、エンジンによって

  1. 平均燃費(ガソリン、ディーゼル)

は、簡単な操作を行うことはできませんモデルによって

  • 平均走行距離を作ることにより、
  • 平均走行距離がありますgroup byを、各レコードのサンプル数の観点から重み付け年数(cars_checked)ne平均の問題の平均を避けるように考慮されるべきである。

    これを達成する正しい方法は何ですか? group byに加重平均を行うサンプル数を考慮する方法はありますか?

    更新 - 出力フォーマットは、クエリを単純化する1つの方法はgrouping setsを使用することである

    engine | mileage_by_engine 
    -------------------------- 
    petrol | xx.z 
    diesel | yy.z 
    
  • +0

    出力の表示方法を教えてください。 –

    +0

    @vkp - 出力フォーマットで更新 – user3206440

    答えて

    3
    SELECT engine, SUM(cars_checked * avg_mileage)/SUM(cars_checked) AS avgMilageByEngine 
    FROM [YOUR_TABLE] 
    GROUP BY engine 
    
    SELECT make, SUM(cars_checked * avg_mileage)/SUM(cars_checked) AS avgMilageByMake 
    FROM [YOUR_TABLE] 
    GROUP BY make 
    
    SELECT model, SUM(cars_checked * avg_mileage)/SUM(cars_checked) AS avgMilageByModel 
    FROM [YOUR_TABLE] 
    GROUP BY model 
    
    1

    例として、#1上記のために追加:

    select engine, make, model, 
         sum(cars_check * avg_mileage)/sum(cars_checked) as avgMilage 
    from t 
    group by grouping sets ((engine), (make), (model)); 
    

    出力フォーマットは、非有します列では-NULL値は集計されていません。は集計されています。