Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите составить запрос или подскажите что другое [D7, Firebird 2.0]


Megabyte ©   (2006-11-08 17:37:00) 

База: "ремонт телефонов".
Есть таблица Repair_progress, куда заносятся этапы ремонта телефона: переход на каждый этап - это новая запись.
Также у каждого ремонта(не этап, а ремонт конкретного телефона) есть уникальный идентификатор Repair_ID.
Есть поле, кот. показывает, на каком этапе находится телефон: Repair_State_ID.
Мне надо сделать запрос, в котором выдать, сколько cделал за сегодня конкретный человек. А также суммировать количество для группы(конкретная спеуиальность: техники-ремонтники, бригадиры, техник входного контроля).
Признак того, что телефон починен - это отгружен на склад: Repair_State_ID = 11.
user_link_group - связь специальности и логина пользователя.
right_group - специальности.
7000, 17000, 26000, 3000, 10000, 9000 - нужные мне специальности.
Я могу пока только сделать это в 2-х запросах:
Для каждого человека:
select G.group_title, L.login, count(distinct P.repair_progress_id)
from repair_progress P, repair_progress R, user_list L, right_group G, user_link_group Gl
where (P.responsible_personal_id = L.personal_id) and (P.is_delete > 0) and
(R.repair_state_id = 11) and (P.repair_id = R.repair_id) and
(cast(P.progress_timestamp as date) = current_date)
and (L.User_List_id = Gl.user_list_id) and (G.right_group_id = Gl.right_group_id)
and (L.user_list_id = any(
select Lg.user_list_id
from user_link_group Lg
where Lg.right_group_id in (7000, 17000, 26000, 3000, 10000, 9000)))
group by G.group_title, L.login

Для группы:
select G.group_title, count(distinct P.repair_progress_id)
from repair_progress P, repair_progress R, user_list L, right_group G,
user_link_group Gl
where (P.responsible_personal_id = L.personal_id) and (P.is_delete > 0) and
(R.repair_state_id = 11) and (P.repair_id = R.repair_id) and
(cast(P.progress_timestamp as date) = current_date)
and (L.User_List_id = Gl.user_list_id) and (G.right_group_id = Gl.right_group_id)
and (L.user_list_id = any(
select Lg.user_list_id
from user_link_group Lg
where Lg.right_group_id in (7000, 17000, 26000, 3000, 10000, 9000)))
group by G.group_title

Union'ом не могу возпользоваться, т.к. разное количество полей.
А хотелось бы в идеале получить такое, если это возможно вообще:
техник-ремонтник Иванов 6
техник-ремонтник Петров 8
техник-ремонтник Сидоров 12
                                      26
бригадир Вова 20
бригадир Вася 30
                    50

и т.д.
Т.е. как бы двойная группировка: сначала по логину, а потом для группы логинов.


Megabyte   (2006-11-09 09:18:00) [1]

спасибо.


evvcom   (2006-11-08 19:13:00) [2]

Или для группы:
select G.group_title, null,count(distinct P.repair_progress_id)
и опять же union all


ANB   (2006-11-08 18:12:00) [3]


> G.group_title, L.login

Склей эти 2 поля в одно и сделай union all


Наверх

Титульная страница Поиск, карта сайта Написать письмо