powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
11 сообщений из 36, страница 2 из 2
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959161
Dimitry SibiryakovАнна Карасиковаполучается без двойного обращения к мастеру всё таки не обойтись?
Сначала расскажите зачем Вы обращаетесь к нему дважды и чем Вас не устроил простой
Код: sql
1.
2.
select ..., count(distinct master.id), count(*) from master join detail on ...
group by ....



Спасибо за совет! Просто раньше с этим не сталкивалась и не знала о таком варианте запроса. Для других задач это решение подойдёт, но не для этой конкретной задачи. Потому что в услугах одного случая могут быть разные значения группируемых полей.
То есть данные выглядят примерно так:
Случаи
ИД; ФИО_Вр; Спец;
1; ФИО_1; Спец_1
2; ФИО_2; Спец_1
3; ФИО_1; Спец_2

Услуги
ИД; ИД_случая; ФИО_Вр; Спец;
1; 1; ФИО_1; Спец_1
2; 1; ФИО_2; Спец_1
3; 2; ФИО_2; Спец_1
4; 2; ФИО_2; Спец_1
5; 2; ФИО_2; Спец_1
6; 3; ФИО_1; Спец_2
7; 3; ФИО_3; Спец_2

И в результате отчета должно получиться
ФИО_Вр; Спец; Случаев; Услуг
ФИО_1; Спец_1; 1; 1
ФИО_1; Спец_2; 1; 1
ФИО_2; Спец_1; 1; 4
ФИО_3; Спец_2; 0; 1

А получиться
ФИО_1; Спец_1; 1; 2
ФИО_2; Спец_1; 1; 3
ФИО_1; Спец_2; 1; 2
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959169
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала Вам надо бы определиться какая у вас таблица - мастер, а какая - деталь и как
они вообще связаны между собой.

Анна КарасиковаА получиться
А потом - поменять тип джоина на соответствующий.

PS: всё-таки прежде чем писать сложные запросы надо научиться писать простые.
PPS: А за нарушение первой НФ в аду для разработчиков БД придумано отдельное наказание.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959172
mvb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна КарасиковаЕсть 2 связанные таблицы:
"Случаи" - LIST_CASES(Case_ID Integer, RF_ID integer, PHYS_ID varchar(22), CODE_SPEC varchar(10), TARGET integer),
"Услуги" - LIST_USL(USL_ID Integer, Case_ID Integer, RF_ID integer, PHYS_ID varchar(22), CODE_SPEC varchar(10), K_USL integer, CODE_USL varchar(20)).


какие знакомые буковки.. Напишите мне, мыло в профиле..
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959177
Dimitry SibiryakovДля начала Вам надо бы определиться какая у вас таблица - мастер, а какая - деталь и как
они вообще связаны между собой.

PS: всё-таки прежде чем писать сложные запросы надо научиться писать простые.
PPS: А за нарушение первой НФ в аду для разработчиков БД придумано отдельное наказание.

Обе рассматриваемые таблицы удовлетворяют всем правилам 1NF!

Поясню суть данных: таблица List_Cases содержит данные о законченных случаях лечения, в ней указывается лечащий врач; в таблице List_Usl содержатся данные об оказанных услугах в рамках законченного случая лечения, и в ней указывается врач, выполнивший конкретную услугу. В требуемом отчете нужно сгруппировать данные о врачах, оказывавших разовые услуги и закрывающих случаи лечения.

Получается в этом конкретном примере без двойного обращения к таблице случаев не обойтись, из-за необходимости группировки различных по смыслу типов данных.

А для другого рода задач COUNT(DISTINCT master.id) подойдёт. Спасибо!
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959185
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна КарасиковаПоясню суть данных: таблица List_Cases содержит данные о законченных
случаях лечения, в ней указывается лечащий врач; в таблице List_Usl содержатся данные об
оказанных услугах в рамках законченного случая лечения, и в ней указывается врач,
выполнивший конкретную услугу. В требуемом отчете нужно сгруппировать данные о врачах,
оказывавших разовые услуги и закрывающих случаи лечения.
Повторяю вопрос ещё раз, медленно: как (каким отношением) эти таблицы связаны и кто из них
мастер?

PS: На то, что прикреплённая тема будет хоть кем-то прочитана, я уже и не надеюсь...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959190
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна КарасиковаИ в результате отчета должно получиться
ФИО_Вр; Спец; Случаев; Услуг
ФИО_1; Спец_1; 1; 1
ФИО_1; Спец_2; 1; 1
ФИО_2; Спец_1; 1; 4
ФИО_3; Спец_2; 0; 1
Код: sql
1.
2.
3.
4.
5.
select a.PHYS_ID, a.CODE_SPEC, coalesce(c1,0), coalesce(c2,0) from
  (select PHYS_ID, CODE_SPEC, count(*) as c1 from LIST_CASES group by 1,2) a
full join
  (select PHYS_ID, CODE_SPEC, count(*) as c2 from LIST_USL group by 1,2) b
on a.PHYS_ID=b.PHYS_ID and a.CODE_SPEC=b.CODE_SPEC


и всё, никаких ХП.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959195
Dimitry Sibiryakov, если бы вы внимательней читали, по-моему, у вас вопросов не возникло бы. В первом сообщении темы в описании структуры:
Анна КарасиковаЕсть 2 связанные таблицы:
"Случаи" - LIST_CASES( Case_ID Integer, RF_ID integer, PHYS_ID varchar(22), CODE_SPEC varchar(10), TARGET integer),
"Услуги" - LIST_USL(USL_ID Integer, Case_ID Integer, RF_ID integer, PHYS_ID varchar(22), CODE_SPEC varchar(10), K_USL integer, CODE_USL varchar(20)).



Мастер-таблица - это List_cases - Случаи, дочерняя таблица - List_Usl - Услуги. Они связаны через идентификатор случая. В упрощённом описании структуры это поля Case_ID , в примере запроса я указал конкретные названия полей. В базе эти таблицы связаны так: list_cases.list_cases_id => list_usl.rf_case_id
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959235
Dimitry Sibiryakov
Возможно. RTFM COUNT(DISTINCT).

Сразу извиняюсь за глупый вопрос, но что значит "RTFM"? Раньше с этим буквосочетанием не встречалась.
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959240
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна КарасиковаDimitry SibiryakovВозможно. RTFM COUNT(DISTINCT).

Сразу извиняюсь за глупый вопрос, но что значит "RTFM"? Раньше с этим буквосочетанием не встречалась.
Read The Fucking Manual (Читайте ёбаную инструкцию) — употребляемый в Интернете ответ на тривиальный вопрос, ответ на который находится в документации/
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959247
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Политкорректно - Fined :)
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959805
Всем спасибо за ответы! Впредь буду внимательней читать мануалы. :-)

Эту задачу решила через 2 ХП: в первой поочерёдно считаю количество, количество услуг по одной группе параметров и количество услуг по другой группе параметров по каждому типу данных; во второй запрос с условным подсчётом количества случаев и услуг. Может вторая процедура и не очень-то нужно, но у нас в коллективе принято все выборки для отчетов формировать в ХП.

Чтобы было понятней вот выходные параметры первой процедуры:
VR_FIO D_V_0022, VR_SPEC D_V_0010, TIP D_V_0020, COUNT_CASE D_INTEGER, COUNT_POS D_INTEGER, COUNT_USL D_INTEGER

и запрос из второй процедуры:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select t.vr_fio, t.vr_spec
  , sum(iif(t.tip='OMS',t.count_case,0)) as OMS_cases
  , sum(iif(t.tip='OMS',t.count_pos,0)) as OMS_pos
  , sum(iif(t.tip='PROF',t.count_case,0)) as PROF_cases
  , sum(iif(t.tip='PROF',t.count_pos,0)) as PROF_pos
  , sum(iif(t.tip='PROF',t.count_usl,0)) as PROF_usl
  , sum(iif(t.tip='CZ',t.count_case,0)) as CZ_cases
  , sum(iif(t.tip='CZ',t.count_pos,0)) as CZ_pos
  , sum(iif(t.tip='DD',t.count_case,0)) as DD_cases
  , sum(iif(t.tip='DD',t.count_pos,0)) as DD_pos
  , sum(iif(t.tip='DD',t.count_usl,0)) as DD_usl
  , sum(iif(t.tip='MTR',t.count_case,0)) as MTR_cases
  , sum(iif(t.tip='MTR',t.count_pos,0)) as MTR_pos
  , sum(iif(t.tip='MTR',t.count_usl,0)) as MTR_usl
  , sum(iif(t.tip='NI',t.count_case,0)) as NI_cases
  , sum(iif(t.tip='NI',t.count_pos,0)) as NI_pos
  , sum(iif(t.tip='NI',t.count_usl,0)) as NI_usl
  from prev_rep_sch_vr(:year_otch,:month_otch) t
  group by 1, 2
...
Рейтинг: 0 / 0
11 сообщений из 36, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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