Какой самый эффективный способ получить горизонтальное среднее в запросе MySQL? - PullRequest
3 голосов
/ 01 февраля 2010

У меня есть следующая MySQL-таблица

Id  |  One  |  Two  |  Three
----------------------------
1   |  10   |  30   |  20
2   |  50   |  60   |  20
3   |  60   |  NULL |  40

Редактировать: Конечно, таблица не должна быть NULL по умолчанию, но я не хочу, чтобы она влияла на среднее значение (поэтому среднее значение рассчитывается как 50, а не 33,33) .

Я хочу, чтобы это выглядело так, с запросом MySQL:

Id | Average
------------
1  | 20
2  | 43,33
3  | 50

Какой самый эффективный способ добиться этого?

Ответы [ 3 ]

9 голосов
/ 01 февраля 2010
select id, (ifnull(one,0) + ifnull(two,0) + ifnull(three,0))/
  ((one is not null) + (two is not null) + (three is not null)) as average from table
3 голосов
/ 01 февраля 2010

Очевидный вариант, приведенный ниже, сработал бы, если бы у вас не было значений NULL:

SELECT ((col_1 + col_2 + col_3) / 3) AS Average FROM table;

Однако, как подсказывает jxac в другом ответе, вам придется сделать это следующим образом:

SELECT id, (ifnull(col_1, 0) + ifnull(col_2, 0) + ifnull(col_3, 0)) /
  ((col_1 is not null) + (col_2 is not null) + (col_3 is not null)) as Average 
FROM
    table;

Если бы все значения каждого столбца были равны NULL, деление на ноль вернуло бы NULL для этой строки.

2 голосов
/ 01 февраля 2010

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

  SELECT a.id,
         AVG(a.val) AS average
    FROM (SELECT x.id,
                 x.one AS val
            FROM TABLE x
          UNION ALL
          SELECT y.id,
                 y.two AS val
            FROM TABLE y
          UNION ALL
          SELECT z.id,
                 z.three AS val
            FROM TABLE z) a
GROUP BY a.id

Справка:

...