2016-10-17 159 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. 平均里程由发动机(汽油,柴油)
  2. 平均行驶里程为通过使
  3. 平均里程由模型

不能做一个简单的group by作为每个记录的样本数(cars_checked)的重量年龄以避免平均值问题的平均值。

什么是实现它的正确途径?有没有办法考虑在group by中做加权平均的样本数量?相加的输出格式为#1的上方作为例子

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

一种方法以简化查询是使用grouping sets -

更新

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

输出格式具有非-NULL值仅在列而非被汇总。