#sql #oracle #group-by #oracle11g
#sql #Oracle #группировка по #oracle11g
Вопрос:
Я использую популярную таблицу employee в схеме HR Oracle. Пример данных: https://imgur.com/3Xw6go7 Я пытаюсь узнать количество, а также процент людей, которые имеют одинаковую зарплату из этой таблицы.
Однако я получаю сообщение об ошибке при попытке выполнить следующий запрос :
SELECT SALARY, count(*),((count(*)/sum(count(*))))*100 FROM EMPLOYEES
group by salary;
ORA-00937: not a single-group group function
00937. 00000 - "not a single-group group function"
*Cause:
*Action:
Однако, когда я пытаюсь выполнить приведенный ниже запрос, я получаю желаемый результат.
SELECT SALARY, count(*),(count(*)/(select sum(count(*)) from employees group by salary))*100 FROM EMPLOYEES
group by salary;
Может кто-нибудь рассказать, как достичь моей цели, используя сам первый запрос? Я понимаю, что count() возвращает много строк, тогда как sum (count()) возвращает только 1 строку.
Ответ №1:
Вам не хватает OVER()
предложения:
SELECT SALARY, count(*),
count(*) * 100 / sum(count(*)) OVER ()
FROM EMPLOYEES
GROUP BY salary;
Комментарии:
1. почему мы не добавляем никаких аргументов в предложение over() . Раньше я использовал over() для ранжирования, но я не совсем понял, как это используется здесь.
2. Потому что вы хотите, чтобы сумма превышала все строки, поэтому нет
partition by
. Вам не нужна кумулятивная сумма, поэтому ее нетorder by
. Однакоover
для оконной / аналитической функции требуется.3. Теперь, когда я пытаюсь округлить результат % возраста, ВЫБЕРИТЕ ЗАРПЛАТУ, count( ), round(count( ) * 100 / sum(count(*))) OVER() ИЗ ГРУППЫ СОТРУДНИКОВ ПО зарплате; Я получаю другую ошибку: ORA-00923: ИЗ ключевого слова, не найденного там, где ожидалось 00923. 00000 — «ИЗ ключевого слова, не найденного там, где ожидалось»
4. @aravindnk . , , Это было не то, что было в моем ответе, даже до того, как я исправил опечатку. Но проблема заключается в простом балансировании круглых скобок и включении аргумента
count()
.