С Новым годом! Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 20
1

Как создать запрос?

11.12.2016, 16:28. Показов 1644. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите написать запрос! Пожалуйста
Из страны с наибольшим количеством подразделений (департаментов) выбрать работника, у которого в подчинении больше всего человек. Если таких стран несколько, то найти такого работника для каждой из них.

Создал такие таблицы в БД
departments : manager_id, location_id, department_id
employees: employee_id,department_id,manager_id
locations: location_id,country_id
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.12.2016, 16:28
Ответы с готовыми решениями:

Как создать запрос
Всем привет! И снова я с просьбой. У меня есть две таблицы, связанные 1к1 первичными ключами. Как...

Как создать запрос в бд?
В базе данных не могу создать запрос т.к. чайник подскажите кому не трудно.Формулировка запроса...

Как создать запрос
Добрый день. Есть база с такой таблицей: CREATE TABLE `sad` ( `id` int(11) NOT NULL...

как создать запрос
Уважамые знатоки, помогите советом у меня БД по роддому и в запросе мне нужно отразить по дням...

19
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
11.12.2016, 17:31 2
для начала со структурой определись:
если в подразделении может быть только один менеджер departments.manager_id,
зачем работнику указывать и подразделение и менеджера?

Ну и departments.manager_id это ссылка на employees.employee_id? или скрыл от нас ещё и managers?

Добавлено через 6 минут
и зачем locations? В задании этой сущности нет, почему не просто departments.country_id ?
1
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 20
11.12.2016, 18:00  [ТС] 3
departments : department_id, country_id
employees: employee_id,department_id, subordinates(количество подчиненных)
если так создать?
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
11.12.2016, 18:32 4
employees: employee_id,department_id, subordinates(количество подчиненных)

нет количество подсчитывать будем,

вопрос в другом, если менеджер в подразделении только один, а остальные работники подразделения ему подчиняются, то надо оставить departments.manager_id и убрать employees.manager_id

а если подчиненность древовидная и подчиненный одному может быть менеджером у другого, тогда наоборот, надо оставлять employees.manager_id и убирать departments.manager_id.
1
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 20
11.12.2016, 18:40  [ТС] 5
Менеджеров несколько
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
11.12.2016, 19:09 6
Цитата Сообщение от Tarragorn Посмотреть сообщение
Менеджеров несколько
в одном подразделении их может быть несколько? тогда, естественно, атрибута departments.manager_id быть не может

Добавлено через 26 минут
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DECLARE @Tmp TABLE(country_id int, manager_id int, subordinates int)
 
INSERT INTO @Tmp 
SELECT country_id, e.manager_id, COUNT(*) subordinates 
FROM 
  (SELECT country_id, Max(*) MaxCnt FROM departments GROUP BY country_id) md
  /* страны с наибольшим количеством подразделений */
  JOIN departments d ON d.country_id = departments.country_id 
  /* а это подразделения в этих странах */ 
  JOIN employees e ON e.department_id = d.department_id
  JOIN employees m ON e.manager_id = m.employee_id
  /* а это все менеджеры и их подчиненные */
GROUP BY country_id, e.manager_id
 
SELECT t.*
FROM
  (SELECT country_id, MAX(subordinates) subordinates FROM @Tmp GROUP BY country_id) m
  /* максимальное количество подчиненных для выбранных стран */ 
  JOIN @Tmp t ON t.country_id = m.country_id AND t.subordinates = m.subordinates   
  /* а это уже отобранные менеджеры этих стран */
1
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 20
11.12.2016, 19:34  [ТС] 7
Цитата Сообщение от YuryK Посмотреть сообщение
Max(*)
Ругается "Неправильный синтаксис около конструкции "*""
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
11.12.2016, 19:50 8
COUNT(*), конечно

Там сейчас все не верно, сорри, сейчас исправлю

Добавлено через 14 минут
попробуй так
З.Ы. временные таблицы используются, чтобы результат запроса использовать несколько раз в качестве подзапроса

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
DECLATE @Cnt TABLE (country_id int, Cnt int)
 
INSER INTO @Cnt 
SELECT country_id, Count(*) Cnt FROM departments GROUP BY country_id
 
 
DECLARE @Tmp TABLE(country_id int, manager_id int, subordinates int)
 
INSERT INTO @Tmp 
SELECT country_id, e.manager_id, COUNT(*) subordinates 
FROM 
  (SELECT country_id FROM @Cnt WHERE Cnt = (SELECT MAX(Cnt) FROM @Cnt)) md
  /* страны с наибольшим количеством подразделений */
  JOIN departments d ON d.country_id = md.country_id 
  /* а это подразделения в этих странах */ 
  JOIN employees e ON e.department_id = d.department_id
  JOIN employees m ON e.manager_id = m.employee_id
  /* а это все менеджеры и их подчиненные */
GROUP BY country_id, e.manager_id
 
SELECT t.*
FROM
  (SELECT country_id, MAX(subordinates) subordinates FROM @Tmp GROUP BY country_id) m
  /* максимальное количество подчиненных для выбранных стран */ 
  JOIN @Tmp t ON t.country_id = m.country_id AND t.subordinates = m.subordinates   
  /* а это уже отобранные менеджеры этих стран */
1
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 20
11.12.2016, 20:11  [ТС] 9
Цитата Сообщение от YuryK Посмотреть сообщение
SELECT country_id, e.manager_id, COUNT(*) subordinates
Цитата Сообщение от YuryK Посмотреть сообщение
GROUP BY country_id, e.manager_id
Неоднозначное имя столбца "country_id"
если изменить на d.country_id то запрос запустится но нечего не выведет(

Добавлено через 3 минуты
Столбец subordinates хранится только во временной таблице?
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
11.12.2016, 20:15 10
ну а

SELECT * FROM @Cnt
SELECT * FROM @Tmp

чего-нибудь выдают? Я же не на данных запросы писал, мог чего-то и не заметить

Добавлено через 1 минуту
Цитата Сообщение от Tarragorn Посмотреть сообщение
Столбец subordinates хранится только во временной таблице?
да, это же Count(*) при подсчете подчиненных из employees

Добавлено через 1 минуту
Ладно, в моих местах уже три ночи, я - спать, дальше пока сам
1
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 20
11.12.2016, 20:17  [ТС] 11
Не находит эти таблицы

Добавлено через 15 секунд
Ладно спасибо)))
0
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 20
11.12.2016, 20:56  [ТС] 12
в TMP нечего нет
Миниатюры
Как создать запрос?  
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
12.12.2016, 01:05 13
Цитата Сообщение от Tarragorn Посмотреть сообщение
в TMP нечего нет
проверь данные, у меня всё на месте

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
DELETE FROM dbo.employees
DELETE FROM dbo.departments
 
 
INSERT INTO dbo.departments SELECT 11, 1
INSERT INTO dbo.departments SELECT 12, 1
INSERT INTO dbo.departments SELECT 13, 1
INSERT INTO dbo.departments SELECT 14, 1
 
INSERT INTO dbo.departments SELECT 21, 2
INSERT INTO dbo.departments SELECT 22, 2
INSERT INTO dbo.departments SELECT 23, 2
INSERT INTO dbo.departments SELECT 24, 2
  
INSERT INTO dbo.departments SELECT 31, 3
INSERT INTO dbo.departments SELECT 32, 3
INSERT INTO dbo.departments SELECT 33, 3
 
DECLARE @Cnt TABLE (country_id int, Cnt int)
 
INSERT INTO @Cnt 
SELECT country_id, Count(*) Cnt FROM departments GROUP BY country_id
 
SELECT * FROM @Cnt
 
--страна 1, в ней максимум 2 подчиненных
-- 1 м-р с 1-м подчиненным
INSERT INTO employees SELECT 110, 11, NULL
INSERT INTO employees SELECT 111, 11, 110
 
-- 1 м-р с 2-мя подчиненнымы
INSERT INTO employees SELECT 120, 12, NULL
INSERT INTO employees SELECT 121, 12, 120
INSERT INTO employees SELECT 122, 12, 120
 
-- 2 м-ра, один 1 с 1-м подчненным, другой с  2-мя подчиненнымы
INSERT INTO employees SELECT 1301, 13, NULL
INSERT INTO employees SELECT 13011, 13, 1301
INSERT INTO employees SELECT 1302, 13, NULL
INSERT INTO employees SELECT 13021, 13, 1302
INSERT INTO employees SELECT 13022, 13, 1302
 
-- 1 м-р с 1-м подчиненным
INSERT INTO employees SELECT 140, 11, NULL
INSERT INTO employees SELECT 141, 11, 140
 
--страна 2, в ней максимум 3 подчиненных
-- 1 м-р с 3-мя подчиненными
INSERT INTO employees SELECT 210, 21, NULL
INSERT INTO employees SELECT 211, 21, 210
INSERT INTO employees SELECT 212, 21, 210
INSERT INTO employees SELECT 213, 21, 210
 
-- 1 м-р с 2-мя подчиненнымы
INSERT INTO employees SELECT 220, 22, NULL
INSERT INTO employees SELECT 221, 22, 220
INSERT INTO employees SELECT 222, 22, 220
 
-- 2 м-ра, один 1 с 1-м подчненным, другой с  2-мя подчиненнымы
INSERT INTO employees SELECT 2301, 23, NULL
INSERT INTO employees SELECT 23011, 23, 2301
INSERT INTO employees SELECT 2302, 23, NULL
INSERT INTO employees SELECT 23021, 23, 2302
INSERT INTO employees SELECT 23022, 23, 2302
 
-- 1 м-р с 1-м подчиненным
INSERT INTO employees SELECT 240, 24, NULL
INSERT INTO employees SELECT 241, 24, 240
 
--страна 3, в ней максимум 4 подчиненных
-- 1 м-р с 4-мя подчиненными
INSERT INTO employees SELECT 310, 31, NULL
INSERT INTO employees SELECT 311, 31, 310
INSERT INTO employees SELECT 312, 31, 310
INSERT INTO employees SELECT 313, 31, 310
 
-- 1 м-р с 3-мя подчиненными
INSERT INTO employees SELECT 320, 32, NULL
INSERT INTO employees SELECT 321, 32, 320
INSERT INTO employees SELECT 322, 32, 320
INSERT INTO employees SELECT 323, 32, 320
 
-- 1 м-р с 2-мя подчиненными
INSERT INTO employees SELECT 330, 33, NULL
INSERT INTO employees SELECT 331, 33, 330
INSERT INTO employees SELECT 332, 33, 330
 
DECLARE @Tmp TABLE(country_id int, manager_id int, subordinates int)
 
INSERT INTO @Tmp 
SELECT d.country_id, e.manager_id, COUNT(*) subordinates 
FROM 
  (SELECT country_id FROM @Cnt WHERE Cnt = (SELECT MAX(Cnt) FROM @Cnt)) md
  /* страны с наибольшим количеством подразделений */
  JOIN departments d ON d.country_id = md.country_id 
  /* а это подразделения в этих странах */ 
  JOIN employees e ON e.department_id = d.department_id
  JOIN employees m ON e.manager_id = m.employee_id
  /* а это все менеджеры и их подчиненные */
GROUP BY d.country_id, e.manager_id
 
SELECT * FROM @Tmp
 
SELECT t.*
FROM
  (SELECT country_id, MAX(subordinates) subordinates FROM @Tmp GROUP BY country_id) m
  /* максимальное количество подчиненных для выбранных стран */ 
  JOIN @Tmp t ON t.country_id = m.country_id AND t.subordinates = m.subordinates   
  /* а это уже отобранные менеджеры этих стран */
Миниатюры
Как создать запрос?  
1
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 20
12.12.2016, 09:03  [ТС] 14
Почему-то все равно не работает
Миниатюры
Как создать запрос?  
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
12.12.2016, 09:11 15
покажи своих employees

Добавлено через 2 минуты
там менеджеры то есть вообще?

SELECT *
FROM
employees e
JOIN employees m ON e.manager_id = m.employee_id
1
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 20
12.12.2016, 09:21  [ТС] 16
Как-то так
Миниатюры
Как создать запрос?   Как создать запрос?  
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
12.12.2016, 09:30 17
Цитата Сообщение от Tarragorn Посмотреть сообщение
Как-то так
это разве не мои данные из #13? С ними и запросом, приведенным в #13 и результаты должны быть как в #13

Добавлено через 1 минуту
тогда в
INSERT INTO @Tmp
SELECT d.country_id, e.manager_id, COUNT(*) subordinates
FROM
(SELECT country_id FROM @Cnt WHERE Cnt = (SELECT MAX(Cnt) FROM @Cnt)) md
/* страны с наибольшим количеством подразделений */
JOIN departments d ON d.country_id = md.country_id
/* а это подразделения в этих странах */
JOIN employees e ON e.department_id = d.department_id
JOIN employees m ON e.manager_id = m.employee_id
/* а это все менеджеры и их подчиненные */
GROUP BY d.country_id, e.manager_id

заменяем JOIN на JEFT JOIN и смотрим где соединение таблиц не происходит
1
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 20
12.12.2016, 09:35  [ТС] 18
Цитата Сообщение от YuryK Посмотреть сообщение
это разве не мои данные из #13? С ними и запросом, приведенным в #13 и результаты должны быть как в #13
Все данные как у вас, нечего не изменял

Добавлено через 3 минуты
Цитата Сообщение от YuryK Посмотреть сообщение
заменяем JOIN на JEFT JOIN и смотрим где соединение таблиц не происходит
manager_id везде NULL выводит при LEFT JOIN
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
12.12.2016, 09:39 19
Лучший ответ Сообщение было отмечено Tarragorn как решение

Решение

тогда откуда в #14 contry_Id = 12...33? У нас порядок полей в таблице departments разный)

Добавлено через 4 минуты
то, что у меня страны, у тебя - подразделения, и наоборот
1
0 / 0 / 0
Регистрация: 05.10.2016
Сообщений: 20
12.12.2016, 09:52  [ТС] 20
Цитата Сообщение от YuryK Посмотреть сообщение
н
И правда)))
Теперь все работает
Спасибо большое
0
12.12.2016, 09:52
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.12.2016, 09:52
Помогаю со студенческими работами здесь

Как создать запрос?
Всем добрый день) Я новичок, решил написать на Access базу данных "Университет", но не могу...

Как создать запрос
дана таблица её скрин во вложенных файлах,в ней 50 строк, 6 отделов и столбец дата это дата приема...

Как создать запрос
Здравствуйте! Есть таблица: fldIdIzm fldАтрибуты fld0 fld1 fld2 fld3...

Как создать запрос на выход
Помогите найти ошибку? При закрытии программы выскакивает запрос на потверждение о закрытии...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на Go/Golang с Kafka и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru