2016-04-19 3 views
1

Я получил задание со следующими инструкциями:Oracle SQL Developer Создание Просмотр Назначение

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

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

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

Примечание 3: Помните, что данные Person11 беспорядочны. Не забудьте обратить внимание на N и п, когда вы отождествляете человек со значением кошки 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 

Error at Command Line:7 Column:10 Error report: SQL Error: ORA-00979: not a GROUP BY expression 00979. 00000 - "not a GROUP BY expression"

ли текущая ошибкой я получаю

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

+0

Я не знаю о представлениях в Oracle, но в представлениях sql-server не может быть предложения order-by. Какие сообщения об ошибках вы получаете? – rsjaffe

+0

Ошибка в командной строке: 7 Колонка: отчет 10 Ошибка: Ошибка SQL: ORA-00979: не GROUP BY выражение 00979. 00000 - "не GROUP BY выражение" ли текущая ошибка я получаю –

ответ

0

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

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 ; 
+0

Извините, я не очень хорошо разбираюсь в функциях окна - я пробовал это из любопытства, и я получаю сообщение об ошибке - Ошибка в командной строке: 3 Столбец: 22 Отчет об ошибке: Ошибка SQL: ORA-00923: ключевое слово FROM не найдено где ожидается 00923. 00000 - «ОТ ключевое слово не найдено, где ожидалось» Я не вижу причины ошибки, потому что я знаю, что это происходит после выбора, но я новичок в SQL, поэтому он может пройти мимо моего уровня знаний –

+0

Почему нужна GROUP BY? – mathguy

+0

@mathguy. , , Спасибо. Это не так. –

0

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

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

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

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

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

cat in ('n', 'N') 

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

EDIT: Извините, для уточнения: Я думаю, что вы уже на пути. Используйте подзапрос для средней зарплаты, удалите группу (что не повредит ничего, но действительно не используется), и если вы хотите, измените верхнюю (кошку), как я предложил; Я думаю, ваш запрос будет работать с этими изменениями.

Удачи вам!

+0

Спасибо за помощь! Кажется, я все понял. Мне на самом деле не нужна группа, и я был слишком расстроен ... –

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