Средневзвешенный расчет в MySQL? - PullRequest
11 голосов
/ 08 октября 2010

В настоящее время я использую следующий запрос для получения некоторых чисел:

SELECT gid, count(gid), (SELECT cou FROM size WHERE gid = infor.gid)       
FROM infor 
WHERE id==4325 
GROUP BY gid;

Вывод, который я получаю на моем текущем этапе, следующий:

+----------+-----------------+---------------------------------------------------------------+
| gid      | count(gid)      | (SELECT gid FROM size WHERE gid=infor.gid)                    |
+----------+-----------------+---------------------------------------------------------------+
|       19 |               1 |                                                            19 | 
|       27 |               4 |                                                            27 | 
|      556 |               1 |                                                           556 | 
+----------+-----------------+---------------------------------------------------------------+

Я пытаюсьрассчитать средневзвешенное значение, т.е.

(1 * 19 + 4 * 27 + 1 * 556) / (19 + 27 + 556)

Есть ли способ сделатьэто с помощью одного запроса?

Ответы [ 2 ]

14 голосов
/ 08 октября 2010

Использование:

SELECT SUM(x.num * x.gid) / SUM(x.cou)
  FROM (SELECT i.gid,
               COUNT(i.gid) AS num,
               s.cou
          FROM infor i
     LEFT JOIN SIZE s ON s.gid = i.gid
         WHERE i.id = 4325
      GROUP BY i.gid) x
1 голос
/ 08 октября 2010

Вы можете разместить свой исходный запрос как подзапрос и суммировать записи. Я не мог проверить это, так как у меня нет набора данных, который у вас есть, но он должен работать теоретически;)

SELECT SUM(gid)/SUM(weights) AS calculated_average FROM (
  SELECT gid, (COUNT(gid) * gid) AS weights
  FROM infor 
  WHERE id = 4325 
  GROUP BY gid);
...