![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
внутренний массив или последовательный перебор в ХП [D7, Firebird 2.0]
Megabyte © (2007-04-04 17:27:00)Суть:
Мне требуется сделать выборку с условием по агрегатному полю.
select count(distinct Rs.usn), P.responsible_personal_id
from repair_progress P join repair_progress R on R.repair_id = P.repair_id and
R.repair_progress_id > P.repair_progress_id
join repairs Rs on Rs.repair_id = P.repair_id
where (P.is_delete > 0) and (R.is_delete > 0) and (P.repair_state_id = 9) and
(R.repair_progress_id between 401001 and 484366) and (R.repair_state_id in (11, 25))
and (R.repair_progress_id - P.repair_progress_id < 10000) and (Rs.repair_result_id = 6000) and
(P.repair_progress_id = (
select max(Sr.repair_progress_id)
from repair_progress Sr
where (Sr.is_delete > 0) and (R.repair_progress_id - Sr.repair_progress_id < 9000)
and (Sr.repair_id = R.repair_id) and (Sr.repair_state_id = 9)
and (R.repair_progress_id > Sr.repair_progress_id) ) )
group by P.responsible_personal_id
having Count(distinct P.repair_progress_id) > 600
После мне надо выбрать уже детальную информацию для группирующего поля(P.responsible_personal_id), которое попало в предыдущую выборку.
for select distinct P.repair_id, L.personal_title
from repair_progress P join repair_progress R on R.repair_id = P.repair_id and
R.repair_progress_id > P.repair_progress_id
join personal L on P.responsible_personal_id = L.personal_id
join repairs Rs on Rs.repair_id = P.repair_id
where (P.is_delete > 0) and (R.is_delete > 0) and (P.repair_state_id = 9) and
(R.repair_progress_id between 401001 and 484366) and (R.repair_state_id in (11, 25))
and (R.repair_progress_id - P.repair_progress_id < 9000) and (Rs.repair_result_id = 6000) and
(P.responsible_personal_id = :operator_id)and
(P.repair_progress_id = (
select max(Sr.repair_progress_id)
from repair_progress Sr
where (Sr.is_delete > 0) and (R.repair_progress_id - Sr.repair_progress_id < 9000)
and (Sr.repair_id = R.repair_id) and (Sr.repair_state_id = 9)
and (R.repair_progress_id > Sr.repair_progress_id) ) )
Хочу все это сделать в ХП, т.к. есть параметры.
Когда 1-й запрос выдает одну запись, то все просто работает через внутренние параметры. А если записей несколько, то возможно как-то в одной ХП организовать для каждой из записей 1-го запроса выборку во 2-м запросе?
Использовать 1-й запрос как подзапрос для выбора P.responsible_personal_id нельзя, т.к. там группировка, т.е. 2 поля, а не одно выбирается, а без группировки не будет работать условие HAVING BY.
Надеюсь, понятно объяснил, что требуется.
Megabyte (2007-04-05 09:31:00) [1]
> Desdechado © (04.04.07 17:51) [5]
Синтаксис изучить ломает?
Это ж цикл. Выводы сделай.
Тьфу, простите, забыл(проглядел) DO для 1-го внешнего цикла...
Desdechado (2007-04-04 17:51:00) [2]Синтаксис изучить ломает?
Это ж цикл. Выводы сделай.
Megabyte (2007-04-04 17:40:00) [3]Смотри:
for select count(distinct Rs.usn), P.responsible_personal_id
from repair_progress P join repair_progress R on R.repair_id = P.repair_id and
R.repair_progress_id > P.repair_progress_id
join repairs Rs on Rs.repair_id = P.repair_id
where (P.is_delete > 0) and (R.is_delete > 0) and (P.repair_state_id = 9) and
(R.repair_progress_id between 401001 and 484366) and (R.repair_state_id in (11, 25))
and (R.repair_progress_id - P.repair_progress_id < 10000) and (Rs.repair_result_id = 6000) and
(P.repair_progress_id = (
select max(Sr.repair_progress_id)
from repair_progress Sr
where (Sr.is_delete > 0) and (R.repair_progress_id - Sr.repair_progress_id < 9000)
and (Sr.repair_id = R.repair_id) and (Sr.repair_state_id = 9)
and (R.repair_progress_id > Sr.repair_progress_id) ) )
group by P.responsible_personal_id
having Count(distinct P.repair_progress_id) > 600
into :kolvo, :operator_id;
for select distinct P.repair_id, L.personal_title
from repair_progress P join repair_progress R on R.repair_id = P.repair_id and
R.repair_progress_id > P.repair_progress_id
join personal L on P.responsible_personal_id = L.personal_id
join repairs Rs on Rs.repair_id = P.repair_id
where (P.is_delete > 0) and (R.is_delete > 0) and (P.repair_state_id = 9) and
(R.repair_progress_id between 401001 and 484366) and (R.repair_state_id in (11, 25))
and (R.repair_progress_id - P.repair_progress_id < 9000) and (Rs.repair_result_id = 6000) and
(P.responsible_personal_id = :operator_id) and
(P.repair_progress_id = (
select max(Sr.repair_progress_id)
from repair_progress Sr
where (Sr.is_delete > 0) and (R.repair_progress_id - Sr.repair_progress_id < 9000)
and (Sr.repair_id = R.repair_id) and (Sr.repair_state_id = 9)
and (R.repair_progress_id > Sr.repair_progress_id) ) )
into :usn, :operator
do
suspend;
Так работать не будет. Без ";" после into :kolvo, :operator_id тоже будет ругаться на 2-й FOR SELECT
Megabyte (2007-04-04 17:30:00) [4]Извиняюсь, не HAVING BY, а просто HAVING
Desdechado (2007-04-04 17:30:00) [5]FOR SELECT
?
Megabyte (2007-04-04 17:28:00) [6]Не суть важно, но в 1-м запросе в селекте так нагляднее:
select count(distinct P.repair_progress_id), P.responsible_personal_id