Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/26: Рейтинг темы: голосов - 26, средняя оценка - 4.77
 Аватар для BigOblom
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478

Группировка в запросе

23.04.2013, 17:58. Показов 5641. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется БД "Учет вычислительной техники".
Нужно выбрать:
Инвентарные номера (card.inv), наименования вычислительной техники (equipment.name_equip), дату поступления (card.delivery_date) и дату списания (card.writeoff_date), цену (card.cost), подразделение (subdivision.name_subdiv).
У каждого инвентарного номера может быть несколько событий (перемещение, списание и т.д.).

Я сделал часть, осталось сгруппировать по полям subdivision.name_subdiv и card.id_card. Попытки не увенчались успехом. Прошу помощи.
SQL
1
2
3
SELECT card.id_card, card.inv, equipment.name_equip, card.cost, card.delivery_date, card.writeoff_date, subdivision.name_subdiv, (SELECT MAX(movement.date_m) FROM movement WHERE  card.id_card = movement.id_card) AS last_date
FROM subdivision RIGHT JOIN (equipment RIGHT JOIN (event RIGHT JOIN (card INNER JOIN movement ON card.id_card = movement.[id_card]) ON event.id_event = movement.event) ON equipment.id_equip = card.id_equip) ON (subdivision.id_subdiv = movement.for_m)
WHERE (((movement.event)<>2));
Миниатюры
Группировка в запросе  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.04.2013, 17:58
Ответы с готовыми решениями:

Группировка в запросе
Добрый день всем. Проблема такая: создал базу и таблицы. Заполнил их данными. Теперь хочу составить запрос и сгруппировать данные по...

Группировка данных в запросе или отчете
Имеется некоторая таблица с полем числовых данных.Хотелось бы создать запрос в котором бы данные из поля таблицы располагались в запросе в...

Группировка в sql запросе
На машине XP стоит Microsoft SQL сервер. Запросы к нему посылаю из access 2003 стоит на этой же машине. Есть три таблицы в базе 1)...

15
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,380
24.04.2013, 03:25
пример БД будет? Enter в коде нажимать не получается?

T-SQL
1
2
3
4
5
6
7
SELECT card.id_card, card.inv, equipment.name_equip, card.cost, card.delivery_date, card.writeoff_date, 
subdivision.name_subdiv, (SELECT MAX(movement.date_m) 
FROM movement WHERE  card.id_card = movement.id_card) AS last_date
FROM subdivision RIGHT JOIN (equipment RIGHT JOIN (event RIGHT JOIN (card INNER JOIN movement 
ON card.id_card = movement.[id_card]) ON event.id_event = movement.event) 
ON equipment.id_equip = card.id_equip) ON (subdivision.id_subdiv = movement.for_m)
WHERE (((movement.event)<>2));
0
 Аватар для BigOblom
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
24.04.2013, 06:05  [ТС]
БД во вложении
Вложения
Тип файла: zip IT.zip (168.6 Кб, 16 просмотров)
0
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,380
24.04.2013, 09:06
Цитата Сообщение от BigOblom Посмотреть сообщение
Я сделал часть, осталось сгруппировать по полям subdivision.name_subdiv и card.id_card.
Возьмём id 30196, каким образом вы хотите сгруппировать Актовый зал и Библиотеку?
0
 Аватар для BigOblom
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
24.04.2013, 09:41  [ТС]
Уже разобрался. Сделал с помощью агрегатных функций.
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT card.id_card, 
Last(card.inv) AS [Last-inv], 
Last(equipment.name_equip) AS [Last-name_equip], 
Last(card.cost) AS [Last-cost], 
Last(card.delivery_date) AS [Last-delivery_date], 
Last(card.writeoff_date) AS [Last-writeoff_date], 
Last(subdivision.name_subdiv) AS [Last-name_subdiv], 
Last(movement.date_m) AS [Last-date_m]
FROM subdivision 
RIGHT JOIN (event 
RIGHT JOIN (equipment 
RIGHT JOIN (card 
INNER JOIN movement 
ON card.id_card=movement.id_card) 
ON equipment.id_equip=card.id_equip) 
ON event.id_event=movement.event) 
ON subdivision.id_subdiv=movement.for_m
WHERE (((movement.event)<>2))
GROUP BY card.id_card
ORDER BY card.id_card;
Добавлено через 16 минут
Цитата Сообщение от alvk Посмотреть сообщение
Возьмём id 30196, каким образом вы хотите сгруппировать Актовый зал и Библиотеку?
По полю card.id_card
0
 Аватар для BigOblom
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
14.05.2013, 08:12  [ТС]
Обнаружил косяк в этом хаосе)
Как сделать группировку в этом запросе?
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT 
card.id_card,
card.inv,
equipment.name_equip, 
card.cost, 
card.delivery_date, 
card.writeoff_date, 
subdivision.name_subdiv,
movement.date_m
FROM subdivision 
RIGHT JOIN (event 
RIGHT JOIN (equipment 
RIGHT JOIN (card 
INNER JOIN movement 
ON card.id_card=movement.id_card) 
ON equipment.id_equip=card.id_equip) 
ON event.id_event=movement.event) 
ON subdivision.id_subdiv=movement.for_m
WHERE (((movement.event)<>2))
ORDER BY card.id_card
0
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,380
14.05.2013, 08:36
Либо убрать name_subdiv из запроса, либо взять max(movement.date_m) хотя бы.
0
 Аватар для BigOblom
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
15.05.2013, 07:40  [ТС]
Пробовал с макс датой. Ее нужно вычислять максимальную, когда выполнена группировка по id_card.
А name_subdiv нужна для вывода наименований подразделений, а не их численных значений.

Мне этот запрос нужен для отчета. Сейчас пробую сделать группировку в отчете.

Добавлено через 7 часов 20 минут
UpUp

Добавлено через 15 часов 37 минут
Я добился результата в запросе, но при группировке в отчете пишет про множественную группировку. Так что вопрос все еще актуален.
0
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,380
15.05.2013, 09:19
Цитата Сообщение от BigOblom Посмотреть сообщение
Я добился результата в запросе,
... но вам я этого не покажу

Цитата Сообщение от BigOblom Посмотреть сообщение
но при группировке в отчете пишет про множественную группировку.
и это тоже ни за что не покажу!
0
 Аватар для BigOblom
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
15.05.2013, 09:42  [ТС]
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
SELECT 
card.id_card, 
LAST(card.inv) AS [Last-inv], 
LAST(equipment.name_equip) AS [Last-name_equip], 
LAST(card.cost) AS [Last-cost], 
LAST(card.delivery_date) AS [Last-delivery_date], 
LAST(card.writeoff_date) AS [Last-writeoff_date], 
LAST(SELECT TOP 1 subdivision.name_subdiv 
FROM subdivision, movement,event 
WHERE subdivision.id_subdiv=movement.for_m 
AND movement.id_card=card.id_card 
AND event.id_event<>2 
AND movement.date_m=
(SELECT MAX(movement.date_m) 
FROM movement 
WHERE movement.id_card=card.id_card)) AS [Last-name_subdiv],
MAX(date_m) AS [Last-date_m]
FROM subdivision 
RIGHT JOIN (event 
RIGHT JOIN (equipment 
RIGHT JOIN (card 
INNER JOIN movement 
ON card.id_card=movement.id_card) 
ON equipment.id_equip=card.id_equip) 
ON event.id_event=movement.event) 
ON subdivision.id_subdiv=movement.for_m
WHERE (((movement.event)<>2))
GROUP BY card.id_card
ORDER BY card.id_card;
Делаю этот запрос источником строк для отчета и пишет:
"Многоуровневое предложение GROUP BY не допускается в подчиненном запросе"

В отчете стоит группировка по полю Last-name_subdiv
0
Эксперт MS Access
 Аватар для alvk
7459 / 4592 / 302
Регистрация: 12.08.2011
Сообщений: 14,380
15.05.2013, 12:58
Не понимаю конечно, зачем вы делаете подобную группировку, но скажу только одно: first и last полный отстой и никогда лучше им не пользоваться, если создаётся ситуация, когда нужно подобное, лучше выходить подзапросами, либо как-то ещё, помяните моё слово или прочтите сайт майкрософт:
http://office.microsoft.com/ru... 32232.aspx

Порядок возвращения записей этими функциями носит произвольный характер (за исключением случая, когда запрос содержит предложение ORDER BY).
то есть в вашем случае по id_card, если карты удалялись, то "всего хорошего"
0
 Аватар для BigOblom
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
15.05.2013, 13:00  [ТС]
Цитата Сообщение от alvk Посмотреть сообщение
Не понимаю конечно, зачем вы делаете подобную группировку, но скажу только одно: first и last полный отстой и никогда лучше им не пользоваться, если создаётся ситуация, когда нужно подобное, лучше выходить подзапросами, либо как-то ещё, помяните моё слово или прочтите сайт майкрософт:
http://office.microsoft.com/ru... 32232.aspx
Уже пробую создать несколько отдельных запросов. Отпишусь о результатах.
0
 Аватар для BigOblom
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
30.05.2013, 09:56  [ТС]
Таблица movement

|id_card | date_m | subdivision
| 1 | 01.12.2013 | 5
| 1 | 05.10.2010 | 9
| 2 | 21.04.2000 | 14
| 2 | 01.05.2013 | 10
| 2 | 16.09.2011 | 4
| 3 | 18.03.2010 | 1
| 3 | 11.11.2011 | 8

Нужно из этого выбрать все значения с последней датой, сгруппировать по полю id_card. Значения поля subdivision соответствуют значению макс даты.

Вот так должно получиться

|id_card | date_m | subdivision
| 1 | 01.12.2013 | 5
| 2 | 01.05.2013 | 10
| 3 | 11.11.2011 | 8

T-SQL
1
2
3
4
SELECT movement.id_card, MAX(movement.date_m) AS max_dt, subdivision.name_subdiv
FROM subdivision RIGHT JOIN movement ON subdivision.id_subdiv = movement.for_m
WHERE movement.event <> 2
GROUP BY movement.id_card
Группировку и макс дату нахожу. Застрял на subdivision

Добавлено через 22 часа 18 минут
Вверх
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
30.05.2013, 18:45
Решение только для таблицы movement, поскольку связь с subdivision по какому-то полю for_m совершенно не ясна.

SQL
1
2
3
4
SELECT m.id_card, m.date_m, m.subdivision
FROM movement m, (SELECT id_card, MAX(date_m) AS mx FROM movement GROUP BY id_card) q,
m INNER JOIN q ON m.id_card=q.id_card AND m.date_m=q.mx
WHERE m.event <> 2
1
 Аватар для BigOblom
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
30.05.2013, 21:36  [ТС]
Цитата Сообщение от mobile Посмотреть сообщение
Решение только для таблицы movement, поскольку связь с subdivision по какому-то полю for_m совершенно не ясна.

SQL
1
2
3
4
SELECT m.id_card, m.date_m, m.subdivision
FROM movement m, (SELECT id_card, MAX(date_m) AS mx FROM movement GROUP BY id_card) q,
m INNER JOIN q ON m.id_card=q.id_card AND m.date_m=q.mx
WHERE m.event <> 2
Да связь с subdivision не так важна.
0
 Аватар для BigOblom
124 / 124 / 17
Регистрация: 30.06.2010
Сообщений: 478
03.06.2013, 09:16  [ТС]
mobile, остальное все доделал. Вроде получилось. Еще раз огромное спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.06.2013, 09:16
Помогаю со студенческими работами здесь

Группировка строк в запросе
Здравствуйте! Отправляю к БД такой запрос: SELECT * FROM `messages` WHERE `to`='25' GROUP BY `from` В таблице у меня содержится...

Группировка данных в запросе
Можно ли сделать такой запрос, что бы при группировке был такой вывод 1 - 1,2 2 - 3,5 на данных 1 - 1 1 - 2 2 - 3 2 - 5...

Суммирование и группировка в одном запросе
Доброго времени суток, уважаемые. Есть таблица вида: | name | points | ----------------- | iam1 | 1 | | iam2 | 2 | ...

Группировка В Запросе
Совсем измучался с запросом. Запрос простой, но могу красиво выбрать результаты. Сам запрос: Код ( (Unknown Language)): ...

Группировка в запросе
Доброго времени суток! В результате запроса получаю вот такую таблицу(во вложении): Подскажите, как сгруппировать по первой...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru