powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вывод процедуры в два столбика
24 сообщений из 24, страница 1 из 1
Вывод процедуры в два столбика
    #39745760
Rphoenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте, у меня есть процедура, которая выводит, например, ФИО кто прочел и кто не прочел книгу.
(два запроса в одной процедуре).

Прочел
...
...
...
Не прочел
...


При создании еще одной переменной у меня


. ... null
... null
... null
nul ...


Как объеденить, чтобы было


... ...
... null
... null
?
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39745762
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rphoenix,

хрустального шара у нас нет. Приводи код процедуры, тогда может подскажем
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39745765
Rphoenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Код: 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.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
create or alter procedure HIRURG_EKSTR_VOZR_SPISOK_U1 (
    OTDELENIE_KEY_P integer,
    OUT_STAC_DATE_S date,
    OUT_STAC_DATE_PO date,
    VOZR_S integer,
    VOZR_PO integer)
returns (
    NAME_STROKA varchar(255),
    NOMIB1 integer,
    UMER_N_STAT1 integer,
    FIO1 varchar(255),
    DR1 date,
    OTDEL1 varchar(255),
    NOMIB2 integer,
    UMER_N_STAT2 integer,
    FIO2 varchar(255),
    DR2 date,
    OTDEL2 varchar(255))
as
declare variable NOMIB_PROC integer;
declare variable NOM_STROKI integer;
begin FOR SELECT NOM_STROKI_EH FROM NASTR_EKSTR_HIRURG
       group BY NOM_STROKI_EH
       ORDER BY NOM_STROKI_EH
       INTO :NOM_STROKI
  DO
  BEGIN
   nomib1=null;
   umer_n_stat1=null;
   fio1=null;
 dr1=null;

  IF (NOM_STROKI=1) THEN NAME_STROKA='Острая непроходимость кишечника (K56)';
  IF (NOM_STROKI=2) THEN NAME_STROKA='Острый аппендицит (K35)';
  IF (NOM_STROKI=3) THEN NAME_STROKA='Язва желудка и 12-перстной кишки с кровотечением (K25.0,К25.4, К26.0, К26.4)';
  IF (NOM_STROKI=4) THEN NAME_STROKA='Язва желудка и 12-перстной кишки с прободением (K25.1,К25.5, К26.1, К26.5)';
  IF (NOM_STROKI=5) THEN NAME_STROKA='Язва желудка и 12-перстной кишки с кровотечением и прободением (K25.2, K25.6, K26.2, K26.6)';
  IF (NOM_STROKI=6) THEN NAME_STROKA='Жулудочно-кишечное кровотечение (K92.2)';
  IF (NOM_STROKI=7) THEN NAME_STROKA='Ущемленная грыжа (K40.0, K40.3, K41.0, K41.3, K42.0, K43.0, K44.0, K45.0, K46.0)';
/*  IF (NOM_STROKI=7) THEN NAME_STROKA='Ущемленная грыжа (K40.0, K40.3, K40.4, K41.0, K41.1, K41.3, K41.4, K42.0, K42.1, K43.0, K43.1, K45.0, K45.1, K46.0, K46.1)';*/
  IF (NOM_STROKI=8) THEN NAME_STROKA='Острый холецистит (K80.0, K81.0)';
  IF (NOM_STROKI=9) THEN NAME_STROKA='Острый панкреатит (K85)';
  IF (NOM_STROKI=10) THEN NAME_STROKA='Внематочная беременность (О00.0, О00.1, О00.2, О00.8, О00.9)';
  suspend;

--   name_stroka='оперировано';
--  suspend;
--   name_stroka=null;

   for
       SELECT s.NOMIB FROM SPISOK s INNER JOIN NASTR_EKSTR_HIRURG ON S.mkb_umer_stat=MKB_EH
       WHERE  (s.kol_vo_let BETWEEN :VOZR_S AND :VOZR_PO)
        AND s.otdelenie_key=:OTDELENIE_KEY_P and (s.OUT_STAC_DATE between :OUT_STAC_DATE_s and :OUT_STAC_DATE_PO)
        AND NOM_STROKI_EH=:nom_stroki  AND s.EMERGENCY=1 AND s.RESULT_GOSPIT_STAT=6 AND
       KEY_SPISOK IN
         (SELECT KEY_SPISOK_OPERAT FROM OPERAT
         WHERE KEY_SPISOK_OPERAT IN (SELECT sss.KEY_SPISOK FROM
         SPISOK sss WHERE (sss.kol_vo_let BETWEEN :VOZR_S AND :VOZR_PO)
         AND sss.OTDELENIE_KEY=:OTDELENIE_KEY_P and (sss.OUT_STAC_DATE between :OUT_STAC_DATE_s and :OUT_STAC_DATE_PO))
         and operat.kod_operat<>'60' and operat.kod_operat<>'18' and operat.kod_operat<>'145'
         )
         INTO :nomib_proc
    do begin
        SELECT distinct ss.NOMIB, ss.umer_n_stat, ss.family||' '||ss.name||' '||ss.father, ss.dr, ss.otdelenie_name
        FROM SPISOK ss
        WHERE  (ss.kol_vo_let BETWEEN :VOZR_S AND :VOZR_PO)
            AND ss.OTDELENIE_KEY=:OTDELENIE_KEY_P
            and (OUT_STAC_DATE between :OUT_STAC_DATE_s and :OUT_STAC_DATE_PO)
            and ss.result_gospit_stat=6
            AND ss.nomib=:nomib_proc
        INTO :NOMIB1, :umer_n_stat1, :fio1, :dr1, :otdel1;
       suspend;
    end

  otdel1=null;
nomib1=null;
   umer_n_stat1=null;
  fio1=null;
   dr1=null;
--  name_stroka='не оперировано';
--   suspend;
--  name_stroka=null;

  for
       SELECT s.NOMIB FROM SPISOK s INNER JOIN NASTR_EKSTR_HIRURG ON S.mkb_umer_stat=MKB_EH
       WHERE  (s.kol_vo_let BETWEEN :VOZR_S AND :VOZR_PO)
        AND s.OTDELENIE_KEY=:OTDELENIE_KEY_P and (OUT_STAC_DATE between :OUT_STAC_DATE_s and :OUT_STAC_DATE_PO)
        AND NOM_STROKI_EH=:nom_stroki  AND EMERGENCY=1 AND RESULT_GOSPIT_STAT=6 AND
       KEY_SPISOK NOT IN
         (SELECT KEY_SPISOK_OPERAT FROM OPERAT
         WHERE KEY_SPISOK_OPERAT IN (SELECT KEY_SPISOK FROM
         SPISOK WHERE (kol_vo_let BETWEEN :VOZR_S AND :VOZR_PO)
         AND OTDELENIE_KEY=:OTDELENIE_KEY_P and (OUT_STAC_DATE between :OUT_STAC_DATE_s and :OUT_STAC_DATE_PO))
         and operat.kod_operat<>'60'  and operat.kod_operat<>'18' and operat.kod_operat<>'145'
         )
         INTO :nomib_proc
    do begin
        SELECT distinct ss.NOMIB, ss.umer_n_stat, ss.family||' '||ss.name||' '||ss.father as fio, ss.dr, ss.otdelenie_name
        FROM SPISOK ss
        WHERE  (ss.kol_vo_let BETWEEN :VOZR_S AND :VOZR_PO)
            AND ss.OTDELENIE_KEY=:OTDELENIE_KEY_P
            and (ss.OUT_STAC_DATE between :OUT_STAC_DATE_s and :OUT_STAC_DATE_PO)
            and ss.result_gospit_stat=6
            AND ss.nomib=:nomib_proc
        INTO :NOMIB2, :umer_n_stat2, :fio2, :dr2, :otdel2;
       suspend;
    end

   otdel2=null;
 nomib2=null;
 umer_n_stat2=null;
 fio2=null;
 dr2=null;

  end


END





Идет два запроса, разница KEY_SPISOK IN и KEY_SPISOK NOT IN только
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39745767
Rphoenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rphoenix, мне нужно, чтобы каждый for select отрабатывал в два столбика без 'null' вначале.
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39745777
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RphoenixRphoenix, мне нужно, чтобы каждый for select отрабатывал в два столбика без 'null' вначале.

ну а по человечески это как???
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39745779
Rphoenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m,

в первом сообщении я же привел пример.
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39745786
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rphoenix,

мдя... зря я попросил. Тут это глаз сломаешь.
Непонятно какие у вас атм нулы лезут.
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39745788
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вангую, что человек хочет full join. Но не умеет толком даже объяснить.))
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39745815
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rphoenix,

Если пронумеровать читавших и не читавших внутри каждой книги, то по этому номеру можно сделать либо FULL JOIN (на больших объёмах умрёт), либо UNION ALL с группировкой по этому полю (почти как у тебя "при создании ещё одной переменной).
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39745826
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rphoenixm7m,

в первом сообщении я же привел пример.
и тот пример и вот это пояснение
RphoenixRphoenix, мне нужно, чтобы каждый for select отрабатывал в два столбика без 'null' вначале.
это просто поток сознания которое нуждается в переводе на человеческий
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39745828
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rphoenix,

я бы начал с упрощения самих запросов, а то на них смотреть сложно. IN(...IN) это вообще труба

IF (NOM_STROKI=1) THEN NAME_STROKA='Острая непроходимость кишечника (K56)';
...
наверное на CASE можно заменить, или вообще эти строки в справочнике держать

and operat.kod_operat<>'60' and operat.kod_operat<>'18' and operat.kod_operat<>'145'

заменить на operat.kod_operat NOT IN ('18', '60', '145')
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39745839
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rphoenix,

хочется два столбца, но одним запросом не вытащить? Я недавно делал что-то подобное через list, такой своеобразный костыль. Приведи народу результат, который хочешь видеть.
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39745893
Roman Simakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я знаю кто не прочел книгу
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39745905
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Simakov,

Чукча не читатель, однако.))
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39746023
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RphoenixКак объеденить, чтобы было

Два явных курсора и попеременный фетч в две выходные переменные.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39746058
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Обычно это сложнее, и применяется если нельзя нормально пронумеровать значения внутри каждого столбца.
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39746077
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rphoenix,

мысли, конечно, надо формулировать яснее, но если правильно понял:

FB3.0
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
with ReadedBook(FIO, BOOK) as (
  select 'Иванов', 'Книга 1' from rdb$database union all
  select 'Иванов', 'Книга 2' from rdb$database union all
  select 'Петров', 'Книга 2' from rdb$database
)
,
UnReadedBook(FIO, BOOK) as (
  select 'Иванов', 'Книга 3' from rdb$database union all
  select 'Петров', 'Книга 1' from rdb$database union all
  select 'Петров', 'Книга 3' from rdb$database
),
RB as (
  select rb.FIO, rb.BOOK, row_number() over(partition by rb.FIO order by rb.BOOK) as RN from ReadedBook rb
),
UB as (
  select ub.FIO, ub.BOOK, row_number() over(partition by ub.FIO order by ub.BOOK) as RN from UnReadedBook ub
)
select coalesce(RB.FIO, UB.FIO), RB.BOOK as READED, UB.BOOK as UNREADED from RB
 full join UB on RB.FIO = UB.FIO and RB.RN = UB.RN
order by coalesce(RB.FIO, UB.FIO), RB.BOOK, UB.BOOK



FB < 3.0 - отдельные процедуры с нумератором и full join, как описано, ну или, как уже писали, два явных курсора.
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39746102
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgm,

увы full join пока не умеет выполняться с помощью HASH JOIN, на NESTED LOOP без индексов будет весьма печально.
У автора запросы весьма не тривиальные может быть страшно долго
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39746106
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Зато UNION ALL с группировкой отработает замечательно на любой версии, и никакие индексы не нужны.
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39746124
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgm,

я понял так (раз ТС молчит). Для Книги 1 нужно вывести:
Прочли Не прочли
Иванов Петров
Сидоров Козлов
Баранов
Сорокин
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39746131
Rphoenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

Да, а у меня получается


Прочли Не прочли
Иванов null
Сидоров null
Баранов Петров
Сорокин Козлов
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39746140
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rphoenix,

всего то

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with ReadedBook(FIO, BOOK) as (
  select 'Иванов', 'Книга 1' from rdb$database union all
  select 'Иванов', 'Книга 2' from rdb$database union all
  select 'Петров', 'Книга 2' from rdb$database
)
,
UnReadedBook(FIO, BOOK) as (
  select 'Иванов', 'Книга 3' from rdb$database union all
  select 'Петров', 'Книга 1' from rdb$database union all
  select 'Петров', 'Книга 3' from rdb$database
)
select
  coalesce(ReadedBook.book, UnReadedBook.book) as book,
  ReadedBook.fio as readed,
  UnReadedBook.fio as unreaded
from ReadedBook full join UnReadedBook on ReadedBook.BOOK =  UnReadedBook.BOOK
order by 1, 2, 3
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39746156
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rphoenix,

вот костыль, смотрите. Допустим, селектом (или там не селектом, неважно) Вы получаете два столбца fio1, fio2. Как Вы и написали, с нулями. Делаете select from select в list. List уберёт Вам нули:
Код: sql
1.
2.
3.
4.
5.
6.
select list(fio1, ascii_char(13)), list(fio2, ascii_char(13))
from ( select
            ... fio1,
            .. fio2
         where ...
       )


На клиенте кидаете это в текстовое поле и оно становиться похоже на табличку.
...
Рейтинг: 0 / 0
Вывод процедуры в два столбика
    #39746165
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Ну чушь же.
Добавь строку select 'Сидоров', 'Книга 1' в ReadedBook и поймёшь.

afgm в правильную сторону мыслит, только наоборот, по книге, а не по прочитавшему надо группировать.

Простой вариант без FULL JOIN:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with ReadedBook(FIO, BOOK) as (
  select 'Иванов', 'Книга 1' from rdb$database union all
  select 'Сидоров', 'Книга 1' from rdb$database union all
  select 'Иванов', 'Книга 2' from rdb$database union all
  select 'Петров', 'Книга 2' from rdb$database
)
,
UnReadedBook(FIO, BOOK) as (
  select 'Иванов', 'Книга 3' from rdb$database union all
  select 'Петров', 'Книга 1' from rdb$databaseunion all
  select 'Петров', 'Книга 3' from rdb$database
),
RB as (select rb.FIO, rb.BOOK, row_number() over(partition by rb.BOOK order by rb.FIO) as RN from ReadedBook rb),
UB as (select ub.FIO, ub.BOOK, row_number() over(partition by ub.BOOK order by ub.FIO) as RN from UnReadedBook ub)

select BOOK, max(Readed), max(Unreaded) from
(
select BOOK, RN, FIO as Readed, NULL as Unreaded from RB
union all
select BOOK, RN, NULL, FIO from UB
) as q
group by BOOK, RN
order by BOOK
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вывод процедуры в два столбика
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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