Группировка С помощью Avg дает 0 в качестве AVG PostgreSQL

#sql #postgresql #group-by

Вопрос:

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

 customer_id |   cust_name    |    city    | grade | salesman_id 
------------- ---------------- ------------ ------- -------------
        3002 | Nick Rimando   | New York   |   100 |        5001
        3007 | Brad Davis     | New York   |   200 |        5001
        3005 | Graham Zusi    | California |   200 |        5002
 

Я хочу получить среднюю оценку города Нью-Йорк, в котором я пытался выполнить свой запрос.

 SELECT  Avg(grade),city from customer Group BY city Having city ='New York' ;
 

Но я понял это.

       Avg    |   City         |    
 ------------- ---------------- 
        0000 | New York       |
 

Что можно исправить для моего запроса?

Комментарии:

1. Что такое тип данных grade ? Среднее значение числового типа, дающее 0 результат, обычно не содержит 4 цифр. (Кроме того, это показывает, что я не могу воспроизвести вашу проблему, как описано: dbfiddle.uk/… )

2. Как вы выполняете запрос? Возможно, значение каким-то образом усекается.

3. Работает просто отлично (хотя я думаю, что вы на самом деле хотите where city = ... , а не ИМЕТЬ

4. Моя ошибка, я использовал сброшенные данные, и у класса был числовой тип данных с точностью только до 3.

5. Просто для того, чтобы прояснить для тех, кто найдет это: НАЛИЧИЕ предназначено для ограничения набора результатов столбцами результатов, которые являются агрегированными вычислениями (например, HAVING AVG(grade) > 100 ). Используйте ГДЕ для столбцов результатов, которые являются данными, а не вычислениями.

Ответ №1:

В вашем запросе нет ничего плохого.

Я только что протестировал его в своей базе данных со следующей таблицей:

  ------------- ----------- ------- 
| customer_id | city      | grade |
 ------------- ----------- ------- 
|           1 | New York  |   200 |
|           2 | New York  |   300 |
|           3 | Barcelona |   400 |
 ------------- ----------- ------- 
 

Запрос SELECT city, Avg(grade) FROM customer GROUP BY city; возвращает:

  ----------- ------------ 
| city      | Avg(grade) |
 ----------- ------------ 
| Barcelona |   400.0000 |
| New York  |   250.0000 |
 ----------- ------------ 
 

И запрос SELECT city, Avg(grade) FROM customer GROUP BY city HAVING city='New York'; возвращает:

  ---------- ------------ 
| city     | Avg(grade) |
 ---------- ------------ 
| New York |   250.0000 |
 ---------- ------------ 
 

Возможно, у вас неверный тип столбца «Оценка». Убедитесь, что это номер.

Также вы можете использовать WHERE вместо HAVING :

 SELECT city, Avg(grade) FROM customer WHERE city='New York';
 

Комментарии:

1. Это должен быть комментарий, а не ответ. Пожалуйста, удалите этот ответ и вместо этого прокомментируйте вопрос.