2014-09-24 4 views
3

Так что я не получаю эту ошибку, которую я продолжаю получать.SQL GROUP BY и HAVING

select distinct substr(CUSTZIP, 1,5), AVG(CUSTBAL), custcity, custstate 
from customer 
group by CUSTCITY, custstate 
having CUSTSTATE = 'wa' AND avg(CUSTBAL) >100; 

Ошибка говорит "не GROUP BY выражение" и предлагает добавить 'SUBSTR (CUSTZIP, 1,5), AVG (CUSTBAL)' к группе по пункту, но это не работает. Что я пытаюсь сделать, это перечислить почтовые индексы и средние балансы по городам только в WA и иметь баланс более 100 долларов США. Может кто-то помочь указать мою ошибку для меня. Я уверен, что это что-то простое, но я, похоже, не понимаю его на начальном уровне.

+1

Если вы делаете GROUP BY, вы действительно не нужен DISTINCT –

ответ

1

ошибки вы получаете, потому что вы пытаетесь выполнить агрегацию (т.е. sum, avg и т.д.), а не в том числе всех столбцов в предложении select к вашей статье group by. Если вы выбираете столбец, тогда вы должны группироваться по этому столбцу, а также при использовании агрегатных функций.

В вашем конкретном случае вам необходимо добавить substr(custzip, 1,5) в ваш пункт group by.

select substr(custzip, 1,5), custcity, custstate, avg(custbal) 
from customer 
where custstate = 'wa' 
group by substr(custzip, 1,5), custcity, custstate 
having avg(custbal) > 100; 

Кроме того, обратите внимание, что вы можете удалить distinct, как group by заботится о том, что, как хорошо.

Я также переехал custstate = 'wa' в критерии WHERE. Так как WHERE выполняет до HAVING, это уменьшит количество результатов, в которых необходимо агрегировать.

1

Проблема не в статье having. Это substr(CUSTZIP, 1, 5). Вот один из способов решить эту проблему:

select substr(CUSTZIP, 1, 5), AVG(CUSTBAL), custcity, custstate 
from customer 
group by CUSTCITY, custstate, substr(CUSTZIP, 1, 5) 
having CUSTSTATE = 'wa' AND avg(CUSTBAL) > 100; 

Кстати, select distinct почти никогда не нужно с group by.

В качестве альтернативы, вы можете использовать функцию агрегации:

select max(substr(CUSTZIP, 1, 5)), AVG(CUSTBAL), custcity, custstate 
from customer 
group by CUSTCITY, custstate 
having CUSTSTATE = 'wa' AND avg(CUSTBAL) > 100; 
+0

Просто интересно, когда будет 'distinct' когда-либо будет использоваться' группы by'? Кроме того, не лучше ли ставить неагрегированные критерии в предложении 'where' вместо' have'? – sgeddes

+0

Яркая ошибка. Можете ли вы объяснить мне, почему это работает, когда substr (custzip, 1,5) идет в конце группы, а не в середине или спереди? Или я делал что-то совершенно другое? – Restnom

+0

@Restnom - порядок столбцов в предложениях 'select' и' group by' не имеет значения. Вам просто нужно убедиться, что при использовании агрегации (т. Е. 'Avg()') неагрегированные столбцы включены в предложение 'group by', в этом случае' substr (custzip, 1,5) 'было опущено. – sgeddes

0

Вот несколько советов:

  1. Вы должны принять предположение, что добавление SUBSTR (CUSTZIP, 1,5), AVG (CUSTBAL) 'к группе по статье.

  2. Обратите внимание на отдельную группу и, используя.

Смежные вопросы