powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Покритикуйте запрос
16 сообщений из 16, страница 1 из 1
Покритикуйте запрос
    #38403070
barrac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, покритикуйте запрос, вы же это любите =).

Нужно сделать запрос для отчета по вакцинации, поля(прививка|пациентов всего|пациентов привито|пациентов не привито|процент привитых|колво медотводов с кодами 1-6|медотвод с кодом 1... медотвод с кодом 13)

теперь самое интересное:
1: запрос должен быть отсортирован в заданном порядке, но никакого критерия по которому можно было бы отсортировать нет(просто эта прививка первая эта вторая и т.д. в других отчетах порядок меняется)!
2: Данные по 2,3,4,5 полям считаются в зависимости от прививки, для прививки с кодом 1 интересуют случаи если Дата рождения пациента + 30 дней входит в заданный диапазон плановых дат plan_date, для прививок 2,3,4 дата рождения+3м 29дн, и т.д.

сделал вот так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
select
-- особенно интересует это поле, добавлено для сортировки
case when pr.code=1 then 1
when pr.code=2 then 2
when pr.code=3 then 3
when pr.code=4 then 4
when pr.code=5 then 5
when pr.code=6 then 6
when pr.code=7 then 7
when pr.code=8 then 8
when pr.code=9 then 9
when pr.code=10 then 10
when pr.code=11 then 11
when pr.code=12 then 12
when pr.code=13 then 13
when pr.code=14 then 14
when pr.code=15 then 15 end N,
pr.short_title,
count( distinct case when pr.code=1 and dateadd(day,30,p.birthday) between :DATESTART and :DATEEND then p.id
when pr.code in (2,3,4) and dateadd(month,3, dateadd(day,29,p.birthday)) between :DATESTART and :DATEEND then p.id
when pr.code in (5,6,7,8) and dateadd(month,12,p.birthday) between :DATESTART and :DATEEND then p.id
when pr.code in (9,10,11,12,13,14,15) and dateadd(month,24,p.birthday) between :DATESTART and :DATEEND then p.id
end) pv,
count( distinct case when dcim.fact_date is not null and pr.code=1 and dateadd(day,30,p.birthday) between :DATESTART and :DATEEND then p.id
when dcim.fact_date is not null and pr.code in (2,3,4) and dateadd(month,3, dateadd(day,29,p.birthday)) between :DATESTART and :DATEEND then p.id
when dcim.fact_date is not null and pr.code in (5,6,7,8) and dateadd(month,12,p.birthday) between :DATESTART and :DATEEND then p.id
when dcim.fact_date is not null and pr.code in (9,10,11,12,13,14,15) and dateadd(month,24,p.birthday) between :DATESTART and :DATEEND then p.id
end) pp,
count( distinct case when dcim.fact_date is null and pr.code=1 and dateadd(day,30,p.birthday) between :DATESTART and :DATEEND then p.id
when dcim.fact_date is null and pr.code in (2,3,4) and dateadd(month,3, dateadd(day,29,p.birthday)) between :DATESTART and :DATEEND then p.id
when dcim.fact_date is null and pr.code in (5,6,7,8) and dateadd(month,12,p.birthday) between :DATESTART and :DATEEND then p.id
when dcim.fact_date is null and pr.code in (9,10,11,12,13,14,15) and dateadd(month,24,p.birthday) between :DATESTART and :DATEEND then p.id
end) pn,
-- и вот это поле, нахождение процента, может как нибудь проще надо сделать? ))
cast(
count(distinct case when dcim.fact_date is not null and pr.code=1 and dateadd(day,30,p.birthday) between :DATESTART and :DATEEND then p.id
when dcim.fact_date is not null and pr.code in (2,3,4) and dateadd(month,3, dateadd(day,29,p.birthday)) between :DATESTART and :DATEEND then p.id
when dcim.fact_date is not null and pr.code in (5,6,7,8) and dateadd(month,12,p.birthday) between :DATESTART and :DATEEND then p.id
when dcim.fact_date is not null and pr.code in (9,10,11,12,13,14,15) and dateadd(month,24,p.birthday) between :DATESTART and :DATEEND then p.id
end)
as float)/cast(
count( distinct case when pr.code=1 and dateadd(day,30,p.birthday) between :DATESTART and :DATEEND then p.id
when pr.code in (2,3,4) and dateadd(month,3, dateadd(day,29,p.birthday)) between :DATESTART and :DATEEND then p.id
when pr.code in (5,6,7,8) and dateadd(month,12,p.birthday) between :DATESTART and :DATEEND then p.id
when pr.code in (9,10,11,12,13,14,15) and dateadd(month,24,p.birthday) between :DATESTART and :DATEEND then p.id
end
) as float)*100 pproc,
count(case when mo.code in(1,2,3,4,5,6) then dcim.med_otvod end) mpv,
count(case when mo.code=1 then dcim.med_otvod end) mo1,
count(case when mo.code=2 then dcim.med_otvod end) mo2,
count(case when mo.code=3 then dcim.med_otvod end) mo3,
count(case when mo.code=4 then dcim.med_otvod end) mo4,
count(case when mo.code=5 then dcim.med_otvod end) mo5,
count(case when mo.code=6 then dcim.med_otvod end) mo6,
count(case when mo.code=7 then dcim.med_otvod end) mo7,
count(case when mo.code=8 then dcim.med_otvod end) mo8,
count(case when mo.code=9 then dcim.med_otvod end) mo9,
count(case when mo.code=10 then dcim.med_otvod end) mo10,
count(case when mo.code=11 then dcim.med_otvod end) mo11,
count(case when mo.code=12 then dcim.med_otvod end) mo12,
count(case when mo.code=13 then dcim.med_otvod end) mo13
from doctab_immunology dcim
inner join ref_privivka pr on pr.id=dcim.privivka
inner join doc_immunology dim on dim.id=dcim.owner
inner join ref_patients p on dim.patients=p.id
left join ref_med_otvod mo on dcim.med_otvod=mo.id
where pr.code in(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) and dcim.plan_date between :DATESTART and :DATEEND
group by N,short_title
order by N



P.S. Не знаю как табличку в сообщение вставлять.
...
Рейтинг: 0 / 0
Покритикуйте запрос
    #38403083
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrac
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
case  when pr.code=1 then  1
when pr.code=2 then  2
when pr.code=3 then  3
when pr.code=4 then  4
when pr.code=5 then  5
when pr.code=6 then  6
when pr.code=7 then  7
when pr.code=8 then  8
when pr.code=9 then  9
when pr.code=10 then 10
when pr.code=11 then 11
when pr.code=12 then 12
when pr.code=13 then 13
when pr.code=14 then 14
when pr.code=15 then 15 end


Феерично.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Покритикуйте запрос
    #38403094
barrac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
очень долго думал))))
но сортировка:
по алфавиту-не катит,
по возрасту - не катит,
какое нибудь доп поле в таблице(для конкретного отчета?) - не катит!
кол-во прививок в этом отчете строго 15.
...
Рейтинг: 0 / 0
Покритикуйте запрос
    #38403113
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrac,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
case when pr.code=1 then 1
when pr.code=2 then 2
when pr.code=3 then 3
when pr.code=4 then 4
when pr.code=5 then 5
when pr.code=6 then 6
when pr.code=7 then 7
when pr.code=8 then 8
when pr.code=9 then 9
when pr.code=10 then 10
when pr.code=11 then 11
when pr.code=12 then 12
when pr.code=13 then 13
when pr.code=14 then 14
when pr.code=15 then 15 end N



аналогично (если конечно тип поля int)

Код: sql
1.
case when pr.code between 1 and 15 then pr.code end N



если же pr.code сам по себе ограничен, то вообще нет смысла извращаться
Код: sql
1.
pr.code as N
...
Рейтинг: 0 / 0
Покритикуйте запрос
    #38403140
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(для версии ФБ, понимающей СТЕ)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
with c as(
    select
    -- особенно интересует это поле, добавлено для сортировки
    pr.code as N,
    pr.short_title,
    count( distinct case when pr.code=1 and dateadd(day,30,p.birthday) between :DATESTART and :DATEEND then p.id
    when pr.code in (2,3,4) and dateadd(month,3, dateadd(day,29,p.birthday)) between :DATESTART and :DATEEND then p.id
    when pr.code in (5,6,7,8) and dateadd(month,12,p.birthday) between :DATESTART and :DATEEND then p.id
    when pr.code in (9,10,11,12,13,14,15) and dateadd(month,24,p.birthday) between :DATESTART and :DATEEND then p.id
    end) pv,
    count( distinct case when dcim.fact_date is not null and pr.code=1 and dateadd(day,30,p.birthday) between :DATESTART and :DATEEND then p.id
    when dcim.fact_date is not null and pr.code in (2,3,4) and dateadd(month,3, dateadd(day,29,p.birthday)) between :DATESTART and :DATEEND then p.id
    when dcim.fact_date is not null and pr.code in (5,6,7,8) and dateadd(month,12,p.birthday) between :DATESTART and :DATEEND then p.id
    when dcim.fact_date is not null and pr.code in (9,10,11,12,13,14,15) and dateadd(month,24,p.birthday) between :DATESTART and :DATEEND then p.id
    end) pp,
    count( distinct case when dcim.fact_date is null and pr.code=1 and dateadd(day,30,p.birthday) between :DATESTART and :DATEEND then p.id
    when dcim.fact_date is null and pr.code in (2,3,4) and dateadd(month,3, dateadd(day,29,p.birthday)) between :DATESTART and :DATEEND then p.id
    when dcim.fact_date is null and pr.code in (5,6,7,8) and dateadd(month,12,p.birthday) between :DATESTART and :DATEEND then p.id
    when dcim.fact_date is null and pr.code in (9,10,11,12,13,14,15) and dateadd(month,24,p.birthday) between :DATESTART and :DATEEND then p.id
    end) pn,
--    -- и вот это поле, нахождение процента, может как нибудь проще надо сделать? ))
--    cast(
--    count(distinct case when dcim.fact_date is not null and pr.code=1 and dateadd(day,30,p.birthday) between :DATESTART and :DATEEND then p.id
--    when dcim.fact_date is not null and pr.code in (2,3,4) and dateadd(month,3, dateadd(day,29,p.birthday)) between :DATESTART and :DATEEND then p.id
--    when dcim.fact_date is not null and pr.code in (5,6,7,8) and dateadd(month,12,p.birthday) between :DATESTART and :DATEEND then p.id
--    when dcim.fact_date is not null and pr.code in (9,10,11,12,13,14,15) and dateadd(month,24,p.birthday) between :DATESTART and :DATEEND then p.id
--    end)
--    as float)/cast(
--    count( distinct case when pr.code=1 and dateadd(day,30,p.birthday) between :DATESTART and :DATEEND then p.id
--    when pr.code in (2,3,4) and dateadd(month,3, dateadd(day,29,p.birthday)) between :DATESTART and :DATEEND then p.id
--    when pr.code in (5,6,7,8) and dateadd(month,12,p.birthday) between :DATESTART and :DATEEND then p.id
--    when pr.code in (9,10,11,12,13,14,15) and dateadd(month,24,p.birthday) between :DATESTART and :DATEEND then p.id
--    end
--    ) as float)*100 pproc,
    count(case when mo.code in(1,2,3,4,5,6) then dcim.med_otvod end) mpv,
    count(case when mo.code=1 then dcim.med_otvod end) mo1,
    count(case when mo.code=2 then dcim.med_otvod end) mo2,
    count(case when mo.code=3 then dcim.med_otvod end) mo3,
    count(case when mo.code=4 then dcim.med_otvod end) mo4,
    count(case when mo.code=5 then dcim.med_otvod end) mo5,
    count(case when mo.code=6 then dcim.med_otvod end) mo6,
    count(case when mo.code=7 then dcim.med_otvod end) mo7,
    count(case when mo.code=8 then dcim.med_otvod end) mo8,
    count(case when mo.code=9 then dcim.med_otvod end) mo9,
    count(case when mo.code=10 then dcim.med_otvod end) mo10,
    count(case when mo.code=11 then dcim.med_otvod end) mo11,
    count(case when mo.code=12 then dcim.med_otvod end) mo12,
    count(case when mo.code=13 then dcim.med_otvod end) mo13
    from doctab_immunology dcim
        join ref_privivka pr on pr.id=dcim.privivka
        join doc_immunology dim on dim.id=dcim.owner
        join ref_patients p on dim.patients=p.id
        left join ref_med_otvod mo on dcim.med_otvod=mo.id
    where pr.code in(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15) and dcim.plan_date between :DATESTART and :DATEEND
    group by pr.code, short_title
)
select n,short_title,pv,pp,pn, 100.00*(pp/pv) pproc
from c
--order by N
...
Рейтинг: 0 / 0
Покритикуйте запрос
    #38403190
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
baracсортировка:
по алфавиту-не катит,
по возрасту - не катит,
Не катится - кантуй. Убери вообще order by и будет тебе счастье. Или потребуй развернуть
слово "заданный порядок".

Симонов Денисесли же pr.code сам по себе ограничен
Посмотри на условие во where.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Покритикуйте запрос
    #38403245
barrac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
что-то не подумал, в первом поле неудачный пример:
на самом деле там:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
case when pr.code=12 then 1
when pr.code=21 then 2
when pr.code=3 then 3
when pr.code=45 then 4
when pr.code=25 then 5
when pr.code=46 then 6
when pr.code=57 then 7
when pr.code=68 then 8
when pr.code=19 then 9
when pr.code=10 then 10
when pr.code=121 then 11
when pr.code=132 then 12
when pr.code=143 then 13
when pr.code=154 then 14
when pr.code=165 then 15 end N,



pr.code - это прививка которая мне нужна, а then 1...15 - это порядковый номер при сортировке.
так что:
Код: sql
1.
case when pr.code between 1 and 15 then pr.code end N


такая сортировка по коду pr.code это не то что мне нужно, а первым полем и order by я соответственно и добиваюсь нужной мне сортировки. pr.code - это поле с авто-инкрементом по нему я обращаюсь к нужно вакцине, и соответственно изменив 10 строчку кода when pr.code=10 then 10 на when pr.code=55 then 10, я изменю на 10 строчке прививку с 10 на 55

авторпотребуй развернуть слово "заданный порядок".
это к сожалению походит на, "дайте мне задание которое я знаю как делать", и к сожалению это тоже не вариант.
А мой пример работает)) просто интересует кто как бы это сделал по другому =)

P.S. FireBird 2.5,
запрос вызывается из FastReport.
...
Рейтинг: 0 / 0
Покритикуйте запрос
    #38403249
barrac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как тут отредактировать свое сообщение?))
а то опять масло масленое получилось.

автори соответственно изменив 10 строчку кода when pr.code=10 then 10 на when pr.code=55 then 10, я при выводе результата изменю на 10 строчке прививку с 10 на 55
...
Рейтинг: 0 / 0
Покритикуйте запрос
    #38403251
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrac,

В таком случае лучше завести отдельное поле под порядок сортировки.
...
Рейтинг: 0 / 0
Покритикуйте запрос
    #38403258
barrac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
такая мысль у меня была до того как я открыл второй отчет ))

первый отчет:
1.БЦЖ
2.V1 Коклюш
3.V1 Дифтерия
4.V1 Полиомелит
5.V2 Коклюш
6.V2 Дифтерия
7.V2 Полиомелит
8.V3 Гепатит
9.V1 Корь

второй отчет:

1.V1 Коклюш
2.V2 Коклюш
3.V1 Дифтерия
4.V2 Дифтерия
5.V1 Полиомелит
6.V2 Полиомелит
7.V3 Гепатит
8.V1 Корь

Ни по алфовиту, ни по номеру вакцинации а есть еще ревакцинации R1... отсортировать будет неправильно
а делать 1 доп поле не получится, а 100 допполей для каждого отчета - просто маразм )
...
Рейтинг: 0 / 0
Покритикуйте запрос
    #38403260
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но сначала всё же определиться: порядок "определённый" кем, где и как.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Покритикуйте запрос
    #38403269
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barrac,

смотря как делать. Если в лоб то конечно 100 полей получится. Но ведь есть вариант размещения порядка в отдельной табличке с доп. полем отвечающим за номер отчёта. Тогда нужно уже не 100 полей а три (ваш код, порядок, код отчёта), а количеcтво записей ~15*100. Зато вы всегда можете поменять порядок вывода без переписывания запроса.
...
Рейтинг: 0 / 0
Покритикуйте запрос
    #38403286
barrac
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, коварный вопрос, так и вытягивающий на "ОПРЕДЕЛЕННУЮ" сортировку по полям, хорошо, полезем в медицину(но тут я уже не очень силен и не факт что все правильно понимаю=).

1.Есть такое понятие - ДЕКРЕТИРОВАННЫЙ ВОЗРАСТ, в нем есть 4 рубежа,30 дней, 3 месяца 29 дней, 12 месяцев, 24 месяца.
2.Есть такой документ - Национальный календарь вакцинации, где прописаны сроки каждой прививки от даты рождения, но их строго не придерживаются, потому что пациент может не прийти отказаться и т.п., поэтому где то есть еще толи рекомендация толи еще что-то в которой тоже прописаны сроки прививок, но уже не от даты рождения а от родительской прививки.

получается что в 1 отчете сортировка частично проходит по рекомендациям календаря, это мои догадки в рамках одного типа прививок т.к. V3 делается позже V2 делается позже V1, кстати когда этот срок прописан одинаково 6 месяцев например для, 3 вакцин, они все равно сортируются по "неписанному правилу раньше-позже", а не по алфавиту.

во 2 отчете, получается берется 1 прививка и сортируется по типу(вначале вакцинации -V потом ревакцинации -R) потом по алфавиту(справедливо для первых трех прививок) дальше не знаю, но знаю что самая первая прививка идет в середине, а отчет начинается со 2 привики(ее V1,V2,V3) потом 3 прививка и ее дочерние, потом 4 прививка.
...
Рейтинг: 0 / 0
Покритикуйте запрос
    #38403291
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barracполезем в медицину
Не надо лезть в медицину. Надо пойти к заказчику и вытрясти из него эту информацию в
письменной форме. Любыми доступными методами. Потому что если её не может сообщить
непосредственный постановщик задачи, это не значит что такая информация вообще не существует.

ОФФ: Я помню как пару месяцев набивал в программу справочные таблицы, а потом "неожиданно"
обнаружилось, что эти таблицы составляются исключительно для простоты восприятия
технологами по определённой, пусть и эмпирической, формуле.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Покритикуйте запрос
    #38403328
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovОФФ: Я помню как пару месяцев набивал в программу справочные таблицы, а потом "неожиданно"
обнаружилось, что эти таблицы составляются исключительно для простоты восприятия
технологами по определённой, пусть и эмпирической, формуле.
Как это? За всю Одессу не скажу, но IIRC технологи не полезут в ПО как
в справочник, если это не их "рабочая среда". А если "рабочая среда", то
спраочники им будут нужны далеко не только для "вспомнить".

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Покритикуйте запрос
    #38403446
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамКак это? За всю Одессу не скажу, но IIRC технологи не полезут в
ПО как в справочник
Эта программа рассчитывала режимы резания (или ещё какую-то подобную фигню) за технолога.
Там формула с несколькими эмпирическими коэффициентами, которые при ручном расчёте берутся
из справочников. И чтобы автоматизировать это дело, я эти справочники вбивал. Как
оказалось - зря. Два месяца работы (а в клавиши я на первом курсе тыкал гораздо медленнее
чем сейчас) псу под хвост. Только из-за того, что не допросили специалистов с пристрастием.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Покритикуйте запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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