powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
36 сообщений из 36, показаны все 2 страниц
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959030
Есть 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)).
Уточнения: RF_ID - идентификатор вышестоящей мастер-талблицы, во входных параметрах известен нужный диапазон значений; K_USL - для всех услуг =1, так что count(*)=sum(k_usl).

Что нужно: написать хранимую процедуру, в которой для каждого уникального сочетания PHYS_ID и CODE_SPEC будет подсчитано количество случаев и услуг для различных диапазонов TARGET, и для некоторых вариантов TARGET нужно считать количество услуг по разным диапазонам CODE_USL; при чем значения для каждого диапозон TARGET должены быть в отдельном столбце(этот момент решила реализовать через использование 2-х ХП, в одной считаю по каждому диапазону целей отдельно, в другой группирую и суммирую).
Главная проблема в том, что не хочется дважды обращаться к таблице случаев.

FireBird 2.5

Подскажите, пожалуйста, как оптимальнее решить эту задачу. Или может где-то подобная проблема уже описана?
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959032
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
студенты потянулись,сезон...
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959036
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Анна Карасикова!
You wrote on 14 мая 2015 г. 17:39:41:

Анна Карасикова> Что нужно: написать хранимую процедуру
в чем печаль твоих обид? (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959038
Gallemar, мой вопрос не относиться к учёбе, совсем.
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959043
Фотография zirra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна Карасикова> Gallemar, мой вопрос не относиться к учёбе, совсем.
...и кто ж тебя, убогую, на работу-то взял?.. :-(

--
Vladimir A.Bakhvaloff
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959045
Мимопроходящий. Извините за неправильно сформулированный вопрос.
Будет лучше если сформулипровать так: "как правильно и оптимально написать ХП для ..."?
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959047
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна Карасиковамой вопрос не относиться к учёбе, совсем.
Тогда из него следует как минимум исключить условие "одним запросом". Ну а потом RTFM CASE.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959052
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Анна Карасикова!
You wrote on 14 мая 2015 г. 17:45:15:

Анна Карасикова> "как правильно и оптимально написать ХП для ..."?
пиши неоптимально, мы поправим.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959053
Я думала здесь конкретные решения подскажут, а не будут оскорбления писать...
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959061
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна Карасикова,

ну и как вы думали, что вам подскажут конкретные решения для ВАШЕЙ конкретной задачи?
Тут подсказывают разве что если "у меня вот так не получается". А у вас вроде бы вообще пока никак не получается.
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959064
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна Карасикова,

Вот придет Таблоид - он напишет. С деревом и рекурсией ;)
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959066
Фотография zirra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна Карасикова> Я думала здесь конкретные решения подскажут, а не будут оскорбления писать...
Поскажут!.. Только с фоткой topless!..

--
Vladimir A.Bakhvaloff
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959082
Мой вариант для случая без разделения по кодам услуг:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
for select tu.phys_id, tu.code_spec, z(sum(tu.k_uslf)) as k_uslf
   from list_usl tu
   where tu.rf_case_id in (select tc.list_cases_id from list_cases tc where tc.target in (1,2,3,4,5,20)and tc.q_u=2
                           and (:r_str like '%,'||trim(cast(tc.rf_reestr_id as varchar(20)))||',%') )
   group by 1,2
  into :vr_fio, :vr_spec, :pos  do
  begin
    select z(count(*)) from list_cases tc
     where (:r_str like '%,'||trim(cast(tc.rf_reestr_id as varchar(20)))||',%')
      and tc.q_u=2 and tc.target in (1,2,3,4,5,20) and tc.phys_id=:vr_fio and tc.code_spec=:vr_spec
    into :kol;
    suspend;
  end
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959089
В основном меня интересует, как в одном запросе посчитать количество записей в мастер-таблице и детейл-таблице с группировкой по N-ому количеству полей мастера без двойного обращения к мастер-таблице. Или такое в принципе не возможно?
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959095
Фотография zirra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна Карасикова> В основном меня интересует, как в одном запросе посчитать количество записей в мастер-таблице и детейл-таблице с группировкой по N-ому количеству полей мастера без двойного обращения к мастер-таблице.
> Или такое в принципе не возможно?
/ смотрим, девушка сурьёзная... topless не прокатит /
Наводящий вопрос: а занафига такое вообще понадобилось в запросе-то?.. Пришло на клиента - там и зри!..

--
Vladimir A.Bakhvaloff
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959096
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Анна Карасикова!

> from list_usl tu
> where tu.rf_case_id in (select...

замени на

from list_usl tu
join list_cases tc on tu.rf_case_id = tc.list_cases_id
where tc.target in (...

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959098
Поручик ·· Ржевский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна КарасиковаВ основном меня интересует, как в одном запросе посчитать количество записей в мастер-таблице и детейл-таблице с группировкой по N-ому количеству полей мастера без двойного обращения к мастер-таблице. Или такое в принципе не возможно?это делается кейсом (CASE) 17641256

например:

COUNT(CASE WHEN Table1.Field1=1 AND Table2.Field2=2 THEN 1 END)
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959111
zirra
Наводящий вопрос: а занафига такое вообще понадобилось в запросе-то?.. Пришло на клиента - там и зри!..

--
Vladimir A.Bakhvaloff

под запросом я имела ввиду выборку данных в хранимой процедуре, типа "for select "
Такого рода расчеты периодически требуются в отчетах различных проектов.
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959118
МимопроходящийHello, Анна Карасикова!

> from list_usl tu
> where tu.rf_case_id in (select...

замени на

from list_usl tu
join list_cases tc on tu.rf_case_id = tc.list_cases_id
where tc.target in (...


Вариант с JOIN сравнивала с мои, он работает чуточку медленнее, чем мой, на несколько миллисекунд.
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959127
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна Карасикова,

что за функция Z?
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959130
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна КарасиковаВ основном меня интересует, как в одном запросе посчитать количество
записей в мастер-таблице и детейл-таблице с группировкой по N-ому количеству полей мастера
без двойного обращения к мастер-таблице. Или такое в принципе не возможно?
Возможно. RTFM COUNT(DISTINCT).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959131
Поручик ·· Ржевский , получается без двойного обращения к мастеру всё таки не обойтись? Или я уже совсем туплю, потому что никак не могу понять как условная выборка значения поможет в расчете количества строк для мастера и детэйла одновременно.
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959133
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисчто за функция Z?

Скорее всего из rfunc.
Эквивалентна
Код: sql
1.
coalesce(:param, 0e0)

возвращает DOUBLE PRECISION
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959136
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анна Карасиковаполучается без двойного обращения к мастеру всё таки не обойтись?
Сначала расскажите зачем Вы обращаетесь к нему дважды и чем Вас не устроил простой
Код: sql
1.
2.
select ..., count(distinct master.id), count(*) from master join detail on ...
group by ....


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #38959139
Шавлюк Евгений.
Функция "Z" из библиотеки rfunc, она возвращает либо значение входного параметра(число), либо 0, если входной параметр = Null.
...
Рейтинг: 0 / 0
Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
    #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
36 сообщений из 36, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как в одном запросе посчитать количество строк для мастера и детэйла с группировкой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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