Как найти сложный SQL-запрос

У меня есть такая таблица:

Таблица: Работник

   EmpId:  INTEGER NOT NULL
   DeptId: INTEGER NOT NULL
   Name:   Char(40) NOT NULL
   Age:    INTEGER NOT NULL
   Salary: INTEGER NOT NULL

Таблица: отделение

   DeptId: INTEGER NOT NULL
   Name:   Char(40) NOT NULL
   Rank:   INTEGER NULL

Мне нужно найти следующий запрос: -

a) Ранжировать весь отдел в порядке убывания среднего возраста всех сотрудников в этом отделе, а затем соответствующим образом обновить столбец ранжирования. Таким образом, отдел с наивысшим средним возрастом сотрудников должен получить 1 место, отдел со вторым по величине средним возрастом сотрудников - 2 и так далее.

В случае, если средний возраст сотрудников нескольких отделов одинаков, их следует ранжировать по уникальному идентификатору DeptId. Рейтинг отдела без какого-либо сотрудника обновлять не следует.

б) Перечислить названия отделов вместе с общими бюджетами отдела. Общий бюджет просто определяется как сумма заработной платы сотрудников в этом отделе. Если в отделе нет сотрудников, их сумма должна быть равна 0.

c) SQL-запрос для вывода названий всех отделов таким образом, чтобы средняя зарплата в отделе превышала 10,00,000.

SQL-сервер или MySQL? Вы можете улучшить этот вопрос, включив образцы данных и ожидаемый результат. И вы должны показать, что вы пробовали, иначе циники могут заподозрить, что вы хотите, чтобы они делали вашу работу за вас.

P.Salmon 21.07.2018 11:45

Смотрите meta.stackoverflow.com/questions/333952/… и успокаивайте этих циников

Strawberry 21.07.2018 12:03

Вы изучили команды SQL AVG (для получения среднего возраста и заработной платы), RANK, DENSE_RANK или ROW_NUMBER для функции ранжирования? Мне это очень похоже на домашнее задание ...

Lmu92 21.07.2018 13:13

Это не сложнее, чем приготовление спагетти. Пожалуйста, не называйте простые соединения сложными - подождите, пока ваши sql-операторы охватят 2-3 страницы, прежде чем называть их сложными.

TomTom 21.07.2018 15:14
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
114
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я создал временные таблицы и данные для выполнения запросов

CREATE TABLE #Employee(
EmpId  INTEGER NOT NULL,
DeptId INTEGER NOT NULL,
Name   Char(40) NOT NULL,
Age    INTEGER NOT NULL,
Salary INTEGER NOT NULL
);

CREATE TABLE #Department(
DeptId INTEGER NOT NULL,
Name   Char(40) NOT NULL,
Rank   INTEGER NULL
);

INSERT INTO #Employee VALUES(1,1,'A',34,9000000),
                            (2,2,'B',25,450000),
                            (3,1,'C',45,600000),
                            (4,1,'D',23,340000),
                            (5,2,'E',21,580000),
                            (6,3,'F',26,7500000),
                            (7,1,'G',27,650000),
                            (8,2,'H',28,410000),
                            (9,1,'I',29,120000),
                            (10,2,'J',54,150000),
                            (11,3,'I',65,1500000);

INSERT INTO #Department (DeptId,Name) VALUES(1,'Dept 1'),
                                            (2,'Dept 2'),
                                            (3,'Dept 3');

И ниже приведены запросы, которые будут соответствовать вашим требованиям.

а)

   UPDATE #Department SET RANK=a.Rank
   FROM (SELECT DeptId,AVG(Age) AS 'AvgAge',ROW_NUMBER() OVER (ORDER BY AVG(AGE)DESC,DeptId ASC) AS 'Rank' 
         FROM #Employee GROUP BY DeptId)a 
   WHERE #Department.DeptId=a.DeptId

б)

   SELECT d.Name,SUM(e.Salary) AS 'Total Budget' 
   FROM #Employee e JOIN #Department d 
   ON e.DeptId=d.DeptId 
   GROUP BY d.Name

в)

   SELECT d.Name,AVG(e.Salary) AS 'Avg Sal > 1000000' 
   FROM #Employee e JOIN #Department d 
   ON e.DeptId=d.DeptId
   GROUP BY d.Name HAVING AVG(e.Salary)>1000000

Какая это должна быть версия SQL?

Strawberry 21.07.2018 15:15

Это SQL Server.

TK Rohit 22.07.2018 18:35

Другие вопросы по теме