Функция SQL Group By (столбец) - теперь нельзя выбрать этот столбец - PullRequest
7 голосов
/ 26 мая 2011

Я использовал схему сотрудников HR в Oracle Express и хотел выбрать сотрудников, которые были наняты в конкретный год.

  SELECT hire_date, 
         COUNT(*)
    FROM employees empl
GROUP BY SUBSTR(hire_date, -4)
ORDER BY empl.hire_date;

Столбец hire_date имеет этот формат "01.01.2011", поэтому яЯ хотел бы сгруппировать их, извлекая последние четыре символа.

Проблема в том, что я сталкиваюсь с ошибкой ниже

ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"
*Cause:    
*Action:
Error at Line: 1 Column: 7

Разве это невозможно?

Ответы [ 4 ]

9 голосов
/ 26 мая 2011

Вы не можете выбрать полное hire_date, если вы группируете только по последним четырем цифрам. Подумайте, что произойдет, если у вас есть две строки:

hire_date
=========
01/01/2001
02/02/2001

В строке single , сгенерированной при группировании, каким должен быть hire_date?

Каждый выбранный столбец должен быть столбцом группировки или столбцом агрегирования. Другими словами, попробуйте:

select substr(hire_date,-4), count(*)
from employees
group by substr(hire_date,-4)
order by empl.hire_date;

Я должен отметить, что функции для отдельных строк плохо масштабируются. Если вы хотите много обрабатывать год, вы должны разбить его на отдельный столбец. Это может значительно улучшить производительность, но мера, не угадай!

И, как уже упоминалось в комментариях, substr, вероятно, не лучшее решение, так как это может зависеть от локали (например: возможно, что дата будет отформатирована как YYYY-MM-DD, что не будет хорошо с substring).

Может быть лучше использовать что-то вроде to_char(hire_date,'YYYY') или extract (year from hire_date), которое должно быть более устойчивым.

7 голосов
/ 26 мая 2011

Вы также можете усечь столбец hiredate

select trunc(hiredate, 'yyyy'), count(*) 
from employee
group by trunc(hiredate, 'yyyy')
1 голос
/ 26 мая 2011

, если вы хотите, чтобы сотрудники группы по году были наняты

select to_char(hiredate,'yyyy'),count(*) 
from employee
group by to_char(hiredate,'yyyy')
0 голосов
/ 26 мая 2011

Вы можете использовать только GROUP BY условия или агрегатные функции (MIN, MAX, AVG и т. Д.) В части SELECT запроса GROUP BY.Это работает:

select substr(hire_date,-4), count(*)
from employees empl
group by substr(hire_date,-4)
order by substr(hire_date,-4);
...