2016-04-23 2 views
0

Я пытаюсь исправить свою проблему при использовании AVG, я нашел несколько похожих/релевантных решений и попытался применить его по моему запросу, однако я все еще не мог получить правильное решение ,Получение среднего значения для каждого модуля в MySQL

Вот мой запрос:

SELECT unt_id, sum(enteredCode)/count(DISTINCT unt_id) AS 'avg' FROM tbl_code GROUP BY unt_id 

Где enteredCode имеет значение 1 и unt_id может быть химия, физика и т.д.

Я думаю, что я что-то не хватает, как это показывает только сумму не среднее.

ответ

1

Вы должны просто использовать функцию AVG:

Select unt_id, avg(enteredCode) from tbl_code group by unt_id 
+0

Спасибо! Я пробовал это много раз и полностью работает. Я думаю, после прочтения объяснения @Patrick Marchand, я сейчас собираюсь решить вопрос о значении введенного кода. – Avery

1

Try мышление GROUP BY, как принимая большую кучу строк и положить их на более мелкие сваи, где каждая меньшая куча отождествляются с уникальным значением среди всех групп.

В запросе:

SELECT unt_id 
    , sum(enteredCode)/count(DISTINCT unt_id) AS 'avg' 
    FROM tbl_code 
GROUP BY unt_id 

вы попросили, чтобы все строки, сгруппированные по unt_id и если unt_id имеет 6 различных значений, как 1, 3, 9, 12, 18, 24 (через однако многие строки есть в таблице), у вас будет 6 групп, в которых первая группа состоит из всех строк, где unt_id = 1, вторая группа, где все строки имеют unt_id = 2 и т. д.

Теперь что? Групповые функции, такие как SUM(), COUNT(), AVG(), MAX(), MIN(), будут смотреть на отдельные группы строк и давать вам один результат для каждой группы.

Возвращаясь к вашему запросу, запросив COUNT (DISTINCT unt_id) для, скажем, группы, где unt_id = 3, вы просто получите 1; база данных помещает все строки, где unt_id = 3 в этой группе, поэтому существует только одно отличное значение unt_id. То же самое касается групп 1, 9, 12, 18 и 24; у них есть только один отдельный unt_id в своих группах. (Кстати, заметим, что с помощью этой группировки, MAX (unt_id) = MIN (unt_id) = unt_id для каждой группы.)

Если вы просто рассмотреть:

SELECT unt_id 
    , count(DISTINCT unt_id) as dist_count 
    FROM tbl_code 
GROUP BY unt_id 

вы получите один возвращаемая строка для каждого уникального значения unt_id в ваших данных, а dist_count будет по 1 для каждого из них. Используя этот счет в своем собственном среднем расчете (SUM (введенный код)/COUNT (DISTINCT unt_id)), вы в основном просто делаете SUM (введенный код)/1, поэтому вы видите только сумму.

Когда вы сказали, что «введенный код имеет значение 1», это звучит как 1, это единственное значение, и если бы это было так, то среднее не будет таким захватывающим - это будет всего 1, , Предполагая, что введенный код имеет другие значения, как сказал @bitfiddler, вы можете просто использовать функцию AVG и называть это, считая, что вы хотите найти средний введенный код для всех строк в каждой группе unt_id. (Если вы хотите использовать явный расчет SUM/COUNT для среднего значения, просто помните, что AVG() = SUM()/COUNT() и строки, где null, не рассматриваются.)

Надеюсь, это дает некоторое представление почему вы не получаете результат, который вы намеревались.

+0

Спасибо за объяснение! Я попробовал ответить @ bitfiddler. Я получаю «1» в качестве результатов.Хорошо, да, я думаю, что вы правы, если inputCode содержит «1» для каждой строки, тогда я всегда получаю 1 в качестве результата. Любое предложение? – Avery

+1

Думаю, я решил. Большое спасибо за помощь парням. – Avery