![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
swetik1981 |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 20.12.2007 Репутация: нет Всего: нет |
Имею базу данных, которая упрощённо выглядит так:
База данных - Предприятие: Отдел Сотрудник 1 Степанов 1 Фёдоров 1 Иванов 2 Пивоваров 3 Сидоров 3 Коновалов Мне необходимо вывести на экран таблицу, состоящую из трёх столбцов с указанием номера отдела, количества работающих в нём сотрудников и списка сотрудников. Причём список всех сотрудников, работающих в отделе должен быть представлен в одной ячейке данных С количеством сотрудников всё понятно: "SELECT Отдел, COUNT(Отдел) FROM Предприятие GROUP BY Отдел" Но как загнать в одну ячейку всех сотрудников, работающих в соответствующем разделе, что вывод данных был таков: Отдел Количество Сотрудники 1 3 Степанов Фёдоров Иванов 2 1 Пивоваров 3 2 Сидоров Коновалов Есть ли какая-то функция собирающая в одну строку все строки, представленные в соответствующем наборе записей? |
|||
|
||||
Deniz |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1251 Регистрация: 16.10.2004 Где: Новый Уренгой Репутация: 6 Всего: 44 |
СУБД?
Вроде стандартным методами не получится. (имеется ввиду 1 sql-запросом по стандартам SQL) А вдруг в отделе будет работать >100 чел? Строчка получится очень длинной. Может пересмотреть подход и сделать другую реализацию? Это сообщение отредактировал(а) Deniz - 17.9.2009, 05:51 -------------------- "Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с) |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 45 Всего: 454 |
В некоторых СУБД такая функция есть (скажем group_concat в MySQL), в других это надо организовывать пользовательской функцией.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
skyboy |
|
|||
неОпытный ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9820 Регистрация: 18.5.2006 Где: Днепропетровск Репутация: 15 Всего: 260 |
...а в некоторых сделать это средствами только SQL может вовсе оказаться невозможно...
в таком случае можно делать группировку на клиенте. |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Ну, коли уж тут почти все старожилы отметились и я свои пять копеек внесу....
![]() Вообще такая функция очень не лаконично вписывается в концепцию аггрегации SQL. Все агрегатные функции ANSI SQL детерминированы - на одном и том же наборе данных дают одинаковый результат в не зависимости от порядка перебора набора данных при группировке. В случае же с аггрегирующей конкатенацией мы детерминированный результат получить можем лишь дополнительно указав критерии сортировки. А такая фича находится за пределами стандарта и вне концепции аггрегирования предусмотренной нынешним стандартом. Другими словами аггрегирующая конкатенация - очень не кошерна. ![]() -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
Gluttton |
|
||||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 24 Всего: 54 |
И тут такой я на белом коне
![]() Итак для таблицы: ![]() Вот такой вот запрос (Firebird 2.1):
Вернет вот таки данные: ![]() Что происхоит в этом запросе... Для краткости я приведу результат внутреннего подзапроса:
![]() А всё остальное (т.е. внешний запрос) необходимо для того, что бы получить требуемые данные. Кстати это мой дебют в рекурсивных запросах ![]() -------------------- Слава Україні! |
||||
|
|||||
Gudinya |
|
||||
Новичок Профиль Группа: Участник Сообщений: 46 Регистрация: 2.2.2008 Репутация: 2 Всего: 8 |
Ну раз на коне тут уже влетали, въеду ка я на сером ослике... при том что 99% кода подсмотрел в Oracle Magazine
|
||||
|
|||||
Zloxa |
|
||||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
Поздравляю! ![]() Чесгря, именно это слово, по тому же поводу, я и хотел написать даже до того, как вычитал засереное ;)
см бабушкин метод не понравилось.. оверхедно както и недетрменировано я бы предпочел sub.dept_id<department.dept_id sub.employe_id < department.employe_id (наверняка ведь оно нормализовано) но у тебя тогда получается как бы distinct что тоже как бы находка. ну коли пошла такая пьянка.... мой давний выезд правда только для оракли :( Это сообщение отредактировал(а) Zloxa - 17.9.2009, 10:50 -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
||||
|
|||||
Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 24 Всего: 54 |
Спасибо! Оверхедно - да, недетерминировано - не сказал бы. Запрос не будет работать (будет не коректно работать) на однофамильцах... Идея в том, что бы тех, кого "уже сосчитали" не рассматривали повторно... Про однофамильцев, думаю, что при такой структуре таблицы, коректно обработать однофамильцев из одного отдела будет крайне сложно (для этого прийдеться "играться" с подсчетом количества однофамильцев в отделе и потом их столько раз и повторять)... А вот если был бы ключик, тогда можно было бы устранить этот недостаток... swetik1981, что с однофамильцами делать будем? А вот за это спасибо! [вот что получилось после всех внесенных изменений:
Gudinya, не разобрался я в приведенном запросе... Видать пора начинать изучать Oracle ![]() -------------------- Слава Україні! |
|||
|
||||
Zloxa |
|
|||
![]() Чо? ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3473 Регистрация: 12.9.2008 Репутация: 53 Всего: 161 |
под недетерменированностью я подразумевал что порядок следования фамилий в результате будет зависеть от внешних факторов (порядок заполнения записями таблицы, план запроса....)... Т.е. в разные моменты времени (или разных средах), но на одинаковых данных запрос может возвращать разные результаты Я эту "некорректность" наоборот воспринял как фишку.... ![]() -------------------- Достоверно известно, что 89% людей доверяют статистике взятой с потолка ![]() |
|||
|
||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Составление SQL-запросов | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |