powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Непростой запрос.
5 сообщений из 5, страница 1 из 1
Непростой запрос.
    #39824322
Всем привет.
Прошу помощи в решении задачи.
Дано: база данных mysql пятой версии.
В базе данных есть таблица blank в неё занесены полученные бланки строгой отчетности, каждый бланк уникален и имеет серию и номер. При выдаче бланка подотчетному лицу в поле user_id таблицы blank присваивается соответствующий идентификатор пользователя. Для удобства хранения и учета бланков в таблице есть поле cell куда вносится номер ячейки в которой хранится пачка.
Собственно сама задача: Написать запрос в результате которого выводится таблица с полями: серия, минимальный - максимальный номер бланка, cell, количество бланков в диапазоне. (т.е. для каждой серии, для каждой ячейки должен быть указаны интервалы оставшихся в ячейках бланков и их количество).

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TABLE `blank` (
  `sr` varchar(16) NOT NULL,
  `nr` mediumint(9) unsigned NOT NULL,
  `user_id` int(11) NOT NULL DEFAULT '0',
  `cell` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`sr`,`nr`),
  KEY `cell` (`cell`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
INSERT INTO blank (sr, nr, user_id, cell) VALUES ('КВ1', 1,  0,  1);
INSERT INTO blank (sr, nr, user_id, cell) VALUES ('КВ1', 2,  0,  1);
INSERT INTO blank (sr, nr, user_id, cell) VALUES ('КВ1', 3,  0,  1);
INSERT INTO blank (sr, nr, user_id, cell) VALUES ('КВ1', 4,  1,  1);
INSERT INTO blank (sr, nr, user_id, cell) VALUES ('КВ1', 5,  1,  1);
INSERT INTO blank (sr, nr, user_id, cell) VALUES ('КВ1', 6,  0,  1);
INSERT INTO blank (sr, nr, user_id, cell) VALUES ('КВ1', 7,  0,  1);
INSERT INTO blank (sr, nr, user_id, cell) VALUES ('КВ1', 8,  0,  2);
INSERT INTO blank (sr, nr, user_id, cell) VALUES ('КВ1', 9,  0,  2);
INSERT INTO blank (sr, nr, user_id, cell) VALUES ('КВ1', 10,  2,  2);
INSERT INTO blank (sr, nr, user_id, cell) VALUES ('КВ1', 11,  2,  2);
INSERT INTO blank (sr, nr, user_id, cell) VALUES ('КВ1', 12,  0,  2);
INSERT INTO blank (sr, nr, user_id, cell) VALUES ('КВ2', 1,  0,  2);
INSERT INTO blank (sr, nr, user_id, cell) VALUES ('КВ2', 2  3,  2);



В результате запроса должна получится таблица:

Код: plaintext
1.
2.
3.
4.
5.
sr     nr_min     nr_max     cell     count
KB1      1            3         1       3
KB1      6            7         1       2
KB1      8            9         2       2
KB1      12          12         2       1
KB2      1            1         2       1

Предпологается что задача будет решена с использованием переменных, но это не догма.
Заранее благодарна за любую помощь.
...
Рейтинг: 0 / 0
Непростой запрос.
    #39824327
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в два шага:
1) Пронумеровать группы, см. 7489069 пункт 2 (только там нумерация внутри группы, а у тут нужно нумеровать сами группы)
2) Сгруппировать по номеру группы
...
Рейтинг: 0 / 0
Непростой запрос.
    #39824367
miksoft, Благодарю.

Код: sql
1.
2.
3.
SELECT `sr`, MIN(b.`nr`) AS nr_min, MAX(b.`nr`) AS nr_max, COUNT(b.`nr`) AS nr_count, b.`cell`
FROM (...) b
GROUP BY b.`nm`



Подскажите начало реализации вашей мысли правильное?

Вот сейчас думаю как теперь сформировать группы что бы их пронумеровать.
...
Рейтинг: 0 / 0
Непростой запрос.
    #39824413
Составила вот такой запрос: по логике он должен работать как надо
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT `sr`, min(b.`nr`) AS nr_min, max(b.`nr`) AS nr_max, COUNT(b.`nr`) AS nr_count, b.cell
FROM (
	SELECT bl.*,
		if((@nomerprev!=(bl.nr-1) OR (@cellprev!=bl.cell)OR (@srprev!=bl.sr)), -- если "nomerprev"+1 не равен текущему номеру 
		-- или сменилась ячейка
		-- или сменилась серия
		@rownum:=@rownum+1+least(0, @nomerprev:=bl.nr, @cellprev:=bl.cell, @srprev:=bl.sr), -- то увеличить счетчик 
		-- и присвоим nomerprev, cellprev и srprev текущие значения
		@rownum:=@rownum+least(0, @nomerprev:=bl.nr, @cellprev:=bl.cell, @srprev:=bl.sr)) AS nm -- иначе счетчик останется на прежнем уровне
		-- и присвоим nomerprev, cellprev и srprev текущие значения
	FROM blank bl, (SELECT @rownum:=1, @srprev:=-1, @cellprev:=-1, @nomerprev:=-1) zz
	WHERE bl.user_id!=0
	ORDER BY bl.cell, bl.sr, bl.nr DESC
) b
GROUP BY b.`nm`



Но в результате имею совершенно не верную выборку:
sr nr_min nr_max nr_count cell
КВ1 4 4 1 1
КВ1 11 11 1 2
КВ1 10 10 1 2
КВ2 2 2 1 2

Где то закралась логическая ошибка
...
Рейтинг: 0 / 0
Непростой запрос.
    #39824686
Еще раз Благодарю уважаемого miksoft , за правильное направление моей мысли.
Вот собственно правильно работающий запрос, может кому пригодится.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT `sr`, min(b.`nr`) AS nr_min, max(b.`nr`) AS nr_max, COUNT(b.`nr`) AS nr_count, b.cell, b.nm
FROM (
	SELECT bl.*,
		if((@nomerprev!=(bl.nr-1) OR (@cellprev!=bl.cell)OR (@srprev!=bl.sr)), -- если "nomerprev"+1 не равен текущему номеру 
		-- или сменилась ячейка
		-- или сменилась серия
		@rownum:=@rownum+1+least(0, @nomerprev:=bl.nr, @cellprev:=bl.cell, @srprev:=bl.sr), -- то увеличить счетчик 
		-- и присвоим nomerprev, cellprev и srprev текущие значения
		@rownum:=@rownum+least(0, @nomerprev:=bl.nr, @cellprev:=bl.cell, @srprev:=bl.sr)) AS nm -- иначе счетчик останется на прежнем уровне
		-- и присвоим nomerprev, cellprev и srprev текущие значения
	FROM blank bl, (SELECT @rownum:=0, @srprev:='', @cellprev:=0, @nomerprev:=0) zz
	WHERE bl.user_id = 0
	ORDER BY bl.sr, bl.cell, bl.nr ASC
) b
GROUP BY b.`nm`



Есть правда ограничения. серия не должна быть пустой, а номер бланка и номер ячейки не должны быть нулевыми.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Непростой запрос.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]