powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle SQL
3 сообщений из 3, страница 1 из 1
Oracle SQL
    #39946267
helpsql1999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Возникли проблема с выполнением задания по SQL.

Само задание:
Список сотрудников, работающих в лаборатории, в которой работает самый
молодой сотрудник, не имеющий детей. Данные представить в виде таблицы: Табельный
номер, ФИО_сотрудника (фамилия с инициалами), Пол, Дата рождения, Возраст,
Отклонение оклада от среднего по лаборатории, в которой работает сотрудник.

Вроде бы все верно,но проблема в том что тут я выдаю одну строку беру id и вывожу по этому id всех людей.
Прозвучит глупо но если люди родились в один день а я вывожу одну строку т.к по другому я не знаю как.
Запрос в этом случае некорректен.
Был бы благодарен за подсказку,помощь.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT S_СЛУЖАЩИЕ.ТАБЕЛЬНЫЙ_НОМЕР,
CONCAT(CONCAT(CONCAT("ФАМИЛИЯ",' '),CONCAT(SUBSTR("ИМЯ",0,1),'.')),CONCAT(CONCAT(SUBSTR("ОТЧЕСТВО",0,1),'.'),CONCAT(' ',' '))) AS ФИО,
S_СЛУЖАЩИЕ.ПОЛ,
TO_CHAR(S_СЛУЖАЩИЕ.ДЕНЬ_РОЖДЕНИЯ,'dd.mm.yyyy') ДР,
TRUNC((SYSDATE - S_СЛУЖАЩИЕ.ДЕНЬ_РОЖДЕНИЯ)/365) ВОЗРАСТ,
TRUNC(S_СЛУЖАЩИЕ.ОКЛАД - (SELECT AVG(ОКЛАД) FROM S_СЛУЖАЩИЕ WHERE S_СЛУЖАЩИЕ.ЛАБОРАТОРИЯ_ИД = Л_ИД)) AS ОТКЛОНЕНИЕ
FROM S_СЛУЖАЩИЕ,
(SELECT ЛАБОРАТОРИЯ_ИД Л_ИД
FROM (SELECT * FROM "S_СЛУЖАЩИЕ" LEFT JOIN "S_ДЕТИ_СОТРУДНИКОВ" ON "S_СЛУЖАЩИЕ"."ИД" = "S_ДЕТИ_СОТРУДНИКОВ"."СЛУЖАЩИЙ_ИД"
WHERE "S_ДЕТИ_СОТРУДНИКОВ"."СЛУЖАЩИЙ_ИД" IS NULL
ORDER BY S_СЛУЖАЩИЕ.ДЕНЬ_РОЖДЕНИЯ DESC)
WHERE ROWNUM = 1)
WHERE S_СЛУЖАЩИЕ.ЛАБОРАТОРИЯ_ИД = Л_ИД
...
Рейтинг: 0 / 0
Oracle SQL
    #39946516
PuM256
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
helpsql1999

Вроде бы все верно,но проблема в том что тут я выдаю одну строку беру id и вывожу по этому id всех людей.
Прозвучит глупо но если люди родились в один день а я вывожу одну строку т.к по другому я не знаю как.
Запрос в этом случае некорректен.
Был бы благодарен за подсказку,помощь.


dense_rank() over(order by ДЕНЬ_РОЖДЕНИЯ desc)

Left Join ... Where X Is Null можно заменить на Where Exists.
...
Рейтинг: 0 / 0
Oracle SQL
    #39947224
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
helpsql1999
Вроде бы все верно

Развлекайтесь:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select S_СЛУЖАЩИЕ.ТАБЕЛЬНЫЙ_НОМЕР
     , "ФАМИЛИЯ" ||' '||SUBSTR("ИМЯ", 0, 1)||'.'||SUBSTR("ОТЧЕСТВО", 0, 1)||'.' "ФИО"
     , TO_CHAR(S_СЛУЖАЩИЕ.ДЕНЬ_РОЖДЕНИЯ, 'dd.mm.yyyy') ДР
     , TRUNC(months_between(SYSDATE, S_СЛУЖАЩИЕ.ДЕНЬ_РОЖДЕНИЯ) / 12) ПОЛНЫХ_ЛЕТ
     , S_СЛУЖАЩИЕ.ОКЛАД
     , round( AVG(ОКЛАД) over(partition by ЛАБОРАТОРИЯ_ИД), 2) СРЕДНИЙ_ОКЛАД_ПО_ЛАБЕ
     , round( S_СЛУЖАЩИЕ.ОКЛАД 
             - AVG(ОКЛАД) over(partition by ЛАБОРАТОРИЯ_ИД), 2) AS ОТКЛОНЕНИЕ 
  from "S_СЛУЖАЩИЕ" 
where "ЛАБОРАТОРИЯ_ИД" in(
            select "ЛАБОРАТОРИЯ_ИД" 
              from "S_СЛУЖАЩИЕ" 
             where not exists(select null from "S_ДЕТИ_СОТРУДНИКОВ" where "СЛУЖАЩИЙ_ИД" = "ИД")
             group by "ЛАБОРАТОРИЯ_ИД"
             order by min("ДЕНЬ_РОЖДЕНИЯ")
             fetch first 1 row with ties
             )
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]