我有一个数据库:
id apple orange p q
1 3 2 0 1
2 4 1 1 1
3 2 2 0 0
我想计算水果列的平均值,每个值都用该行中p + q的总和加权。
mean_of_apple
= ( 3 + 4 + 2) / 3
= 3
weighted_mean_of_apple =
= ( (3 * (0 + 1)) + (4 * (1 + 1)) + (2 * (0 + 0)) ) / ( (0 + 1) + (1 + 1) + (0 + 0) )
= 3.6667
通常,为了获得每列的算术平均值,我会做类似的事情:
SELECT AVG(apple), AVG(orange) FROM my_table
如何在没有复杂循环和存储中间结果的情况下获得加权平均值?
我使用PHP查询数据库,因此可以使用MySQL,PHP或两者的组合来计算均值。
我有这个:
$query = "SELECT * FROM fruits";
// ...
// PHP queries the database and gets the results
// ...
$apple = array();
$orange = array();
while($row = $result->fetch_assoc()) {
for($i = 0; $i < ($row["ch1"] + $row["ch2"]); $i++) {
$apple[] = $row["apple"];
$orange[] = $row["orange"];
}
}
$mean_apple = array_sum($apple) / count($apple);
$mean_orange = array_sum($orange) / count($orange);
但我想知道,如果有更好的方法 - 如果这是更正确的话。
请注意,真正的桌子有五个水果和四个重量,如果这对你的答案产生影响。
答案 0 :(得分:2)
您可以使用以下查询执行此操作:
SELECT AVG(apple) AS appleAvg,
SUM(apple * (p+ q)) / SUM(p + q) AS wAppleAvg,
AVG(orange) AS orangeAvg,
SUM(orange * (p + q)) / SUM(p + q) AS wOrangeAvg
FROM mytable