Начало » Использование СУБД » Firebird, HQbird, InterBase » Нужна подсказка ПРОФи
Нужна подсказка ПРОФи [сообщение #23] |
Sun, 12 June 2022 13:08 |
akrush
Сообщений: 6 Зарегистрирован: June 2022 Географическое положение: Украина
|
Junior Member |
|
|
Прошу помощи с запросами.
Сейчас все реализовано через использование и заполнение дополнительных таблиц. Но может можно как-то сделать "в одном флаконе"
1. Сначала выполняется такой скрипт:
CREATE TABLE ALL_srv (
COD_ORG SMALLINT NOT NULL,
COD_POSL SMALLINT,
COD_RIZN SMALLINT,
data_e DATE
);
CREATE TABLE all_TAR (
MARK varchar(15),
COD_POSL SMALLINT NOT NULL,
COD_RIZN SMALLINT NOT NULL,
COST_UNIT NUMERIC(10,5),
COST_UN1 NUMERIC(10,5),
NORM NUMERIC(10,5)
);
commit;
INSERT into ALL_srv SELECT DISTINCT cod_org, 4, posl4, max(data_e) from SERVICE1 WHERE posl4<>0 group BY cod_org, posl4;
INSERT into ALL_srv SELECT DISTINCT cod_org, 8, posl8, max(data_e) from SERVICE1 WHERE posl8<>0 group BY cod_org, posl8;
commit;
INSERT INTO all_tar select case tr.MARK WHEN 0 then 'без ліч.' WHEN 1 then 'з ліч.' WHEN 2 then 'будинковий' end as lich, tr.COD_POSL, tr.COD_RIZN, tr.COST_UNIT, tr.COST_UN1, tr.NORM
from TARIF1 tr where tr.data_e is NULL and tr.tarn=0 and tr.cod_posl=4 and tr.numb=1;
INSERT INTO all_tar select case tr.MARK WHEN 0 then 'без ліч.' WHEN 1 then 'з ліч.' WHEN 2 then 'будинковий' end as lich, tr.COD_POSL, tr.COD_RIZN, tr.COST_UNIT, tr.COST_UN1, tr.NORM
from TARIF1 tr where tr.data_e is NULL and tr.tarn=0 and tr.cod_posl=8 and tr.numb=1;
CREATE INDEX IDX_ALL_srv ON ALL_srv (COD_ORG,COD_POSL,COD_rizn);
commit;
2. После этого выполняю нужны мне запрос:
select
tr.MARK,
tr.COD_POSL,
tr.COD_RIZN,
tr.COST_UNIT,
tr.COST_UN1,
tr.NORM,
list(distinct sr.COD_ORG,'; '),
max(sr.DATA_E)
from ALL_TAR tr
LEFT JOIN all_srv sr on tr.COD_POSL=sr.COD_POSL and tr.COD_RIZN=sr.COD_RIZN
group BY tr.MARK,
tr.COD_POSL,
tr.COD_RIZN,
tr.COST_UNIT,
tr.COST_UN1,
tr.NORM
Пробовал сделать через with, но ругается на второй with
WITH ALL_TAR as (
select
case MARK
WHEN 0 then 'без ліч.'
WHEN 1 then 'з ліч.'
WHEN 2 then 'будинковий'
end as lich,
COD_POSL, COD_RIZN, COST_UNIT, COST_UN1, NORM
from
TARIF1
where
data_e is NULL and
tarn=0 and
cod_posl=4 and
numb=1
union all
select
case MARK
WHEN 0 then 'без ліч.'
WHEN 1 then 'з ліч.'
WHEN 2 then 'будинковий'
end as lich,
COD_POSL, COD_RIZN, COST_UNIT, COST_UN1, NORM
from
TARIF1
where
data_e is NULL
and tarn=0
and cod_posl=8
and numb=1)
with all_srv as (
SELECT DISTINCT cod_org, 4, posl4, max(data_e)
from SERVICE1
WHERE posl4<>0
group BY cod_org, posl4
union all
SELECT DISTINCT cod_org, 8, posl8, max(data_e)
from SERVICE1
WHERE posl8<>0
group BY cod_org, posl8);
select
tr.MARK,
tr.COD_POSL,
tr.COD_RIZN,
tr.COST_UNIT,
tr.COST_UN1,
tr.NORM,
list(distinct sr.COD_ORG,'; '),
max(sr.DATA_E)
from ALL_TAR tr
LEFT JOIN all_srv sr on tr.COD_POSL=sr.COD_POSL and tr.COD_RIZN=sr.COD_RIZN
group BY tr.MARK,
tr.COD_POSL,
tr.COD_RIZN,
tr.COST_UNIT,
tr.COST_UN1,
tr.NORM
|
|
|
|
|
Re: Нужна подсказка ПРОФи [сообщение #26 является ответом на сообщение #25] |
Mon, 13 June 2022 13:25 |
akrush
Сообщений: 6 Зарегистрирован: June 2022 Географическое положение: Украина
|
Junior Member |
|
|
akrush писал(а) Mon, 13 June 2022 13:09у меня больше вопрос не в том как вставить записи, а возможно ли мой "скрипт с промежуточными таблицами" + запрос сделать сразу как один запрос используя with
Разобрался. Для инсерта некоторые вещи работали без явного задания имени поля, а для with нет.
Плюс мне надо было писать не 2 раза with а через запятую.
Пришлось сделать вот так.
Не знаю, может есть и более красивое решение, но в ИБЕ подготовка запроса не руганулся. Сейчас запущу на выполнение
WITH ALL_TAR(MARK,COD_POSL,COD_RIZN,COST_UNIT,COST_UN1,NORM) as (
select case MARK WHEN 0 then 'без ліч.' WHEN 1 then 'з ліч.' WHEN 2 then 'будинковий' end as lich, COD_POSL, COD_RIZN, COST_UNIT, COST_UN1, NORM
from TARIF1 where data_e is NULL and tarn=0 and cod_posl=4 and numb=1
union all
select case MARK WHEN 0 then 'без ліч.' WHEN 1 then 'з ліч.' WHEN 2 then 'будинковий' end as lich, COD_POSL, COD_RIZN, COST_UNIT, COST_UN1, NORM
from TARIF1 where data_e is NULL and tarn=0 and cod_posl=8 and numb=1),
all_srv (COD_ORG, COD_POSL, COD_RIZN, data_e) as (
SELECT DISTINCT cod_org, 4, posl4, max(data_e)
from SERVICE1 WHERE posl4<>0 group BY cod_org, posl4
union all
SELECT DISTINCT cod_org, 8, posl8, max(data_e)
from SERVICE1 WHERE posl8<>0 group BY cod_org, posl8)
select
tr.MARK, tr.COD_POSL, tr.COD_RIZN, tr.COST_UNIT, tr.COST_UN1, tr.NORM, list(distinct sr.COD_ORG,'; '), max(sr.DATA_E)
from ALL_TAR tr
LEFT JOIN all_srv sr on tr.COD_POSL=sr.COD_POSL and tr.COD_RIZN=sr.COD_RIZN
group BY tr.MARK, tr.COD_POSL, tr.COD_RIZN, tr.COST_UNIT, tr.COST_UN1, tr.NORM
В общем тут разобрался.
Ваш форум - это супер идея на замену sql.ru
К сожалению на нем пока мало народу
|
|
|
|
|
Re: Нужна подсказка ПРОФи [сообщение #93 является ответом на сообщение #26] |
Fri, 24 June 2022 19:21 |
m7m
Сообщений: 18 Зарегистрирован: June 2022 Географическое положение: Мариуполь,Укр...
|
Junior Member |
|
|
А что вместо вот этого
select case MARK WHEN 0 then 'без ліч.' WHEN 1 then 'з ліч.' WHEN 2 then 'будинковий' end as lich, COD_POSL, COD_RIZN, COST_UNIT, COST_UN1, NORM
from TARIF1 where data_e is NULL and tarn=0 and cod_posl=4 and numb=1
union all
select case MARK WHEN 0 then 'без ліч.' WHEN 1 then 'з ліч.' WHEN 2 then 'будинковий' end as lich, COD_POSL, COD_RIZN, COST_UNIT, COST_UN1, NORM
from TARIF1 where data_e is NULL and tarn=0 and cod_posl=8 and numb=1
вот такое
select case MARK WHEN 0 then 'без ліч.' WHEN 1 then 'з ліч.' WHEN 2 then 'будинковий' end as lich, COD_POSL, COD_RIZN, COST_UNIT, COST_UN1, NORM
from TARIF1 where data_e is NULL and tarn=0 and cod_posl in (4 , 8) and numb=1
не пойдет?
[Обновления: Fri, 24 June 2022 19:26] Известить модератора
|
|
|
Re: Нужна подсказка ПРОФи [сообщение #1342 является ответом на сообщение #25] |
Sat, 14 January 2023 19:15 |
svd
Сообщений: 49 Зарегистрирован: November 2022
|
Member |
|
|
Всю нить не читал, может уже ответили, но вставлю свои пять копеек:
Если мне не изменяет память синтаксис должен быть следующим:
with stat1 as(....)
, stat2 as ( .... )
select * from stat.....
то есть 'with' идет один раз и разделяются запятыми.
with recursive
dept_year_budget as (
select fiscal_year,
dept_no,
sum(projected_budget) as budget
from proj_dept_budget
group by fiscal_year, dept_no
),
dept_tree as (
select dept_no,
head_dept,
department,
cast('' as varchar(255)) as indent
from department
where head_dept is null
union all
select d.dept_no,
d.head_dept,
d.department,
h.indent || ' '
from department d
join dept_tree h on d.head_dept = h.dept_no
)
select d.dept_no,
d.indent || d.department as department,
dyb_2008.budget as budget_08,
dyb_2009.budget as budget_09
from dept_tree d
left join dept_year_budget dyb_2008
on d.dept_no = dyb_2008.dept_no
and dyb_2008.fiscal_year = 2008
left join dept_year_budget dyb_2009
on d.dept_no = dyb_2009.dept_no
and dyb_2009.fiscal_year = 2009
|
|
|
Переход к форуму:
Текущее время: Sun Nov 24 07:54:21 GMT+3 2024
Общее время, затраченное на создание страницы: 0.01199 секунд
|