Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 30.01.2016
Сообщений: 3
1

Запрос из нескольких таблиц с категориями SQL Access 2007

29.08.2016, 13:40. Показов 1693. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте уважаемые посетители форума!
Разрабатываю базу данных специфического кадрового учета в войсковой части на Access 2007. В процессе разработки возник вопрос, долгим и упорным поиском в интернете ничего не нашел, потому очень прошу помощи у Вас.

Имеем две таблицы - СписокПодразделений и СписокДолжностей.
СписокПодразделений состоит из двух полей -
  1. КодПодразделения [Счетчик]
  2. Наименование [Текст]
СписокДолжностей состоит из следующих полей:
  1. КодДолжности [Счетчик]
  2. КодПодразделения [Ключ для связи с таблицей СписокПодразделений]
  3. НаименованиеДолжности [Текст]
  4. КатегорияДолжности [0/1/2 - показывает для кого предназначена должность. Это может быть гражданский персонал/военнослужащий и т.д.]
  5. ЧислоПоШтату [Количество людей для данной должности согласно штата должностей]

В чем заключается задача - создать запрос с подсчетом количества должностей в каждом подразделении по категориям должностей. То есть:
Наименование подразделенияВсего по штатуИз них: гражд.ВоеннослужащихВоеннослужащие пенсионеры
Управление10271
Обеспечение3030
То есть мне необходимо, чтобы в одном запросе на 1 подразделение было несколько столбцов: Sum(ЧислоПоШтату) без условия, затем Sum(ЧислоПоШтату) WHERE КатегорияДолжности=0; Sum(ЧислоПоШтату) WHERE КатегорияДолжности=1 и т.д. Главная таблица - СписокПодразделений, то бишь - если нет нужной записи в СпискеДолжностей - значит выводим 0. Ну это уже второстепенная проблема, которую я способен решить.
Как ни старался - не получается добиться правильного запроса.

Прошу помощи у профессионалов данного дела
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.08.2016, 13:40
Ответы с готовыми решениями:

access 2007 + sql запрос + vba
накидайте код, пажалуйста :) задача: в vba запилить sql запрос select field1 from table where...

SQL запрос, Count из нескольких таблиц
Здравствуйте, помогите написать один запрос для следующих таблиц: Пусть есть таблица персонала:...

Свободное поле на форме использующее SQL запрос Access 2007
Таблицы уже связаны по другим полям а мне нужно добавить сободное поле на форму и...

SQL запрос двух связанных таблиц access
Доброго времени суток! При составлении SQL запроса возникли проблемы: даны две базы, каждая из...

5
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
29.08.2016, 13:50 2
Лучший ответ Сообщение было отмечено alastor_f32 как решение

Решение

Примерно так
SQL
1
2
3
4
5
6
7
8
SELECT СписокПодразделений.Наименование,  
SUM(ЧислоПоШтату) AS Всего по штату,
-SUM(ЧислоПоШтату*(КатегорияДолжности=0)) AS НазваниеСуммы0,
-SUM(ЧислоПоШтату*(КатегорияДолжности=1)) AS НазваниеСуммы1,
-SUM(ЧислоПоШтату*(КатегорияДолжности=2)) AS НазваниеСуммы2
FROM СписокПодразделений LEFT JOIN СписокДолжностей 
ON СписокПодразделений.КодПодразделения=СписокДолжностей.КодПодразделения
GROUP BY СписокПодразделений.КодПодразделения, СписокПодразделений.Наименование
1
1266 / 448 / 129
Регистрация: 21.03.2013
Сообщений: 1,210
30.08.2016, 12:36 3
Цитата Сообщение от alastor_f32 Посмотреть сообщение
Имеем две таблицы - СписокПодразделений и СписокДолжностей.
насколько я помню у в/ч есть штат.
там есть код подразделения, код высшего подразделения и код должности они не совпадают (уникальны)
одинаковые должности в одном подразделении имею количество (это тот максимум сколько можно назначить людей на должность). Эта структура даст возможность формировать запросы по количеству должностей на любой период времени.
к штату идут изменения - одни должности выводятся - другие добавляются
Советую вести штат (одну таблицу) по структуре штата с добавление полей (номер штата или изменения, дата ввода, дата вывода) Это раз. Помним что военная должность отличается от гражданской наличием ВОС.
Два
Имея таблицу людей закрепленных по должностям из штата тоже с датой назначения и датой увольнения. Помним что наличие специального (воинского) звания отличает человека военного от гражданского. Так будет возможно составить любую выборку по должностям и категориям на любое время.
И три не забываем, что отдельные штаты имеют гриф.
И даже если вы не ведете таблицу штат, как я описал, а ведете наличие посад и их количество эти данные могут тоже попасть под гриф.
1
0 / 0 / 0
Регистрация: 30.01.2016
Сообщений: 3
02.09.2016, 21:56  [ТС] 4
boby104, спасибо за ответ. Да, штат видел с уникальными кодами высших подразделений - но в моей структуре это не актуально.

mobile, огромное спасибо - все получилось, все работает! Не знал, что в SUM можно запихать таким образом условие.
Еще вариант нашел:
SUM(IIf(КатегорияДолжности=0,ЧислоПоШтату,0))

Увеличил запрос с помощью данных конструкций - получил численность по штату, все отлично работает.
Но вот незадача - делаю запрос с выводом 2 столбцов - количество людей в каждом подразделении по штату, затем - количество людей в каждом подразделении по факту. И вот столкнулся вот с какой проблемой.
В запрос мы добавляем следующую таблицу - ЛичныйСостав.
ЛичныйСостав - здесь мы храним каждого человека с указанием места его работы. Состоит из множества полей, основными из которых являются:
  1. КодЧеловека
  2. Фамилия
  3. ТипЧеловека - то же, что и КодДолжности: 0 - военнослужащий, 1 - гражданский персонал и т.д.
  4. КодПодразделения

То бишь, на данный момент я вывожу в запросе:
SQL
1
2
3
4
5
SELECT СписокПодразделений.Наименование,
SUM(IIf(КатегорияДолжности=0,ЧислоПоШтату,0)) AS ВсегоПоШтату,
SUM(IIf(ЛичныйСостав.ТипЧеловека=0,1,0)) AS ВсегоПоСписку
FROM ЛичныйСостав RIGHT JOIN (СписокПодразделений LEFT JOIN СписокДолжностей ON СписокПодразделений.Код = СписокДолжностей.КодПодразделения) ON ЛичныйСостав.КодПодразделения = СписокПодразделений.Код
GROUP BY СписокПодразделений.Код, ЛичныйСостав.КодПодразделения, СписокПодразделений.ПодразделениеПолное;
и получаю неверное значение, и вот почему. Группировка не работает так, как я хочу.
Каждое подразделение выводится столько раз, сколько есть людей в таблице ЛичныйСостав.
В итоге получается вот какая сумма: ЧислоПоШтату * Количество записей в таблице ЛичныйСостав.
То бишь, я хочу получить получить такой вид:
Подразделение № 1 - По штату 40, по списку 23.
В итоге получаю:
Подразделение № 1 - По штату 920 (40*23).
Я конечно понимаю, что здесь ошибка моя - и прошу натолкнуть на путь истинный. Без функций подсчета я увидел, что группировка по КодуПодразделения не работает - ибо в таблице ЛичныйСостав есть множество записей с одним КодомПодразделения, но разными КодамиЧеловека, что в прицнипе логично.
Подскажите пожалуйста, как в одном запросе посчитать как бы это реализовать..
Заранее всем спасибо за ответ!
0
Эксперт MS Access
26806 / 14485 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
02.09.2016, 22:14 5
Если правильно понял... Попробуйте так
SQL
1
2
3
4
5
SELECT СписокПодразделений.Наименование,
MAX(ЧислоПоШтату) AS ВсегоПоШтату,
-SUM(ЛичныйСостав.ТипЧеловека=0) AS ВсегоПоСписку
FROM ...
GROUP BY ...
0
0 / 0 / 0
Регистрация: 30.01.2016
Сообщений: 3
02.09.2016, 22:22  [ТС] 6
Изменений никаких - считает также неправильно.
Здесь проблема, как я заметил, не в том, что я неправильно считаю людей по списку - а в группировке таблиц.
Получается есть рабочий запрос подсчета людей по штату.
Как только я добавляю в JOIN таблицу ЛичныйСостав - где есть несколько людей с одним КодомПодразделения - то сразу неправильно считает, не работает группировка записей как нужно.
0
02.09.2016, 22:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.09.2016, 22:22
Помогаю со студенческими работами здесь

Как в Access 2007 сложить данные из разных таблиц?
допустим мне надо сложить количество имеющихся на складе вещей с количеством прибывших на склад...

Запрос. Access 2007
Есть таблица и вот такой запрос, который выводит возраст людей и количество больничных дней и...

SQL в MS office access 2007
Есть таблица в ней есть колонки Tovar и Price. Нужно сформовать запрос, который выведет список...

Access 2007 и SQL в запросе
Здравствуйте, при построении запросов Access по умолчанию использует INNER JOIN, но чтобы...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru