Oracle SQL Developer Создать назначение представления

У меня есть задание со следующими инструкциями:

Создайте представление с именем A11T1 (это A-One-One-T-One, а не A-L-L-T-L), которое будет отображать объединенное имя, JobTitle и Salary людей, у которых значение Cat равно N и чья зарплата как минимум на 30 процентов выше, чем средняя зарплата всех людей со значением Cat, равным N. Заголовки трех столбцов должны быть такими: Name, JobTitle и Salary. Строки должны быть отсортированы в традиционном порядке телефонной книги.

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

Примечание 2. Для этой задачи составные имена и должности должны отображаться в правильном регистре (например, Мэри Эллен Смит, помощник менеджера).

Примечание 3. Помните, что данные Person11 беспорядочны. Обязательно ищите N и n, когда идентифицируете людей со значением Cat, равным N.

Что у меня есть до сих пор:

CREATE VIEW A11T1 AS 
SELECT INITCAP(FNAME||' '||LNAME) AS "Name", INITCAP(JobTitle), Salary
FROM PERSON11
WHERE UPPER(CAT) = 'N'
GROUP by INITCAP(FNAME||' '||LNAME), INITCAP(JobTitle), Salary
HAVING SALARY >= 1.3 * ROUND(AVG(SALARY),0)
Order by LNAME, FNAME 

Ошибка в командной строке: 7 Столбец: 10 Отчет об ошибке: Ошибка SQL: ORA-00979: не выражение GROUP BY 00979. 00000 — «не выражение GROUP BY»

Текущая ошибка, которую я получаю

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


person Jack Wang    schedule 19.04.2016    source источник
comment
Я не знаю о представлениях в Oracle, но в представлениях sql-server не может быть предложения order-by. Какие сообщения об ошибках вы получаете?   -  person rsjaffe    schedule 20.04.2016
comment
Ошибка в командной строке: 7 Столбец: 10 Отчет об ошибке: Ошибка SQL: ORA-00979: не выражение GROUP BY 00979. 00000 - не выражение GROUP BY Текущая ошибка, которую я получаю   -  person Jack Wang    schedule 20.04.2016


Ответы (2)


Зачем вам нужно «группировать по» объединенному имени, должности и зарплате? У вас есть более одной строки на имя?

Возможно, это потому, что вам нужно рассчитать среднюю зарплату, а для этого требуется агрегирование? Вы не можете сделать все в одном операторе SELECT в SQL (по крайней мере, не с помощью простых инструментов - вы, кажется, находитесь на ранних этапах обучения и не хотите использовать оконные функции).

«Средняя зарплата» должна исходить из подзапроса. Там, где у вас есть >= 1.3 * round(...), вместо этого вы должны иметь:

... >= 1.3 * (select avg(salary) from person11 where cat = 'N')

Обратите внимание, что подзапрос должен быть заключен в круглые скобки. В вашем коде я вижу, что вы используете upper(cat) - есть ли опасения, что кошка может быть в верхнем или нижнем регистре? В таком случае лучше написать

cat in ('n', 'N')

По возможности избегайте переноса значений столбцов внутрь функций (это часто приводит к ухудшению производительности). Также не вижу необходимости округлять среднюю зарплату в ваших требованиях - да и вообще, какой смысл округлять до нуля знаков после запятой, если потом умножать на 1,3? Округление может фактически привести к неправильному выводу.

РЕДАКТИРОВАТЬ: Извините, чтобы уточнить: я думаю, вы уже в пути. Используйте подзапрос для средней зарплаты, удалите группу (что ничего не повредит, но на самом деле не нужно) и, если хотите, измените верхнюю (кошку), как я предложил; Я думаю, что ваш запрос будет работать с этими изменениями.

Удачи!

person mathguy    schedule 20.04.2016
comment
Спасибо за помощь! Я думаю, что я получил повесить его. Мне действительно не нужна была группа все это время, и я все усложнял... - person Jack Wang; 20.04.2016

Я думаю, что самый простой способ использует оконные функции:

CREATE VIEW A11T1 AS 
    SELECT INITCAP(FNAME || '  '|| LNAME) AS Name, INITCAP(JobTitle), Salary
    FROM (SELECT p.*, AVG(SALARY) OVER () as avg_salary
          FROM FROM PERSON11 p
          WHERE UPPER(CAT) = 'N'
         ) p
    WHERE SALARY >= 1.3 * avg_salary
    ORDER BY LNAME, FNAME ;
person Gordon Linoff    schedule 19.04.2016
comment
Извините, я не очень хорошо знаком с оконными функциями - я попробовал это из любопытства и получаю сообщение об ошибке - Ошибка в командной строке: 3 Столбец: 22 Отчет об ошибке: Ошибка SQL: ORA-00923: ключевое слово FROM не найдено там, где ожидалось 00923. 00000 - Ключевое слово FROM не найдено там, где ожидалось. Я не вижу причины ошибки, потому что знаю, что from идет после выбора, но я новичок в SQL, поэтому это может быть за пределами моего уровня знаний. - person Jack Wang; 20.04.2016
comment
Зачем нужна группа по? - person mathguy; 20.04.2016
comment
@mathguy . . . Спасибо. Это не так. - person Gordon Linoff; 20.04.2016