Недавно поменял работу. Здесь работаю на MSSQL и вот возник вопрос, я
спрашивал у одного товарища, работающегго с MSSQL, но оказалось для него
было откровением, что из хп можно возвращать результаты селекта :( .
Нет! Птичка @>- !!! Я твой навеки (с) русская сказка
Значит ситуация такова: данные об оплатах в БД храняться в таблице со
структурой дата платежа, сумма платежа, назначение и ещё несколько
параметров платежей. для отчета выбираю платежи определенного филиала,
накладываю шаблон и преобразовываю данные платежей за месяц в столбцы
месяцев, т.е. получаю 12 запросов каждый по своему месяцу, которые потом
собираю union all'ом суммирую данные и собственно дальше показываю. Теперь
понадобилось добавить на уровень наложения шаблона и преобразования данных в
столбцы операции изменения сумм. Т. к. запрос сейчас и так большой(~ 31 кБ)
добавление в расчеты каждого месяца дополнительных действий увеличит запрос
вдвое его и сопровождать сложно и я боюсь уперется в размер текста запроса,
хотел сделать или view с параметрами или хп возвращающую результат select'а,
НО как оказалось, "хваленый" MSSQL не может ни того, ни другого. Правда
покопавшись на скло.ру нашел решение с хп, но создавать таблицу ради
получения результата что-то совсем не хочется. Вот такая ситуация!
Кто знает MSSQL, помогите советом как можно переделать запрос. Структуру
переделать к сожалению не получится.
Вот примерно то что есть сейчас:
CREATE TABLE CLASS_PAYS (
ID INTEGER,
REF_GROUPS_PAYS INTEGER,
CLASS_PAYS VARCHAR(30)
);
CREATE TABLE GROUP_PAYS (
ID INTEGER,
GROUP_PAYS VARCHAR(10)
);
CREATE TABLE YEAR_PAY (
ID INTEGER,
DATE_PAY DATE,
SUMMA_PAY FLOAT,
FILIAL VARCHAR(30),
NAZNACHENIE_PAY VARCHAR(10),
GROUP_PAYS INTEGER,
CLASS_PAYS INTEGER
);
select e.group_pays,
e.class_pays,
e.naznachenie_pay,
sum(e.month_1) as month_1, sum(e.month_2) as month_2,
sum(e.month_3) as month_3, sum(e.month_4) as month_4,
sum(e.month_5) as month_5, sum(e.month_6) as month_6,
sum(e.month_7) as month_7, sum(e.month_8) as month_8,
sum(e.month_9) as month_9, sum(e.month_10) as month_10,
sum(e.month_11) as month_11, sum(e.month_12) as month_12
from (
select d.group_pays, d.class_pays, c.naznachenie_pay,
case when c.summa is null then 0.00 else c.summa end as month_1,
0.00 as month_2, 0.00 as month_3,
0.00 as month_4, 0.00 as month_5,
0.00 as month_6, 0.00 as month_7,
0.00 as month_8, 0.00 as month_9,
0.00 as month_10, 0.00 as month_11,
0.00 as month_12
from (
select group_pays.group_pays, class_pays.class_pays,
group_pays.id as id_gp, class_pays.id as id_cp
from group_pays inner join class_pays
on group_pays.id = class_pays.ref_groups_pays ) d
left outer join
( select
yp.naznachenie_pay,
sum(yp.summa_pay) as summa,
yp.group_pays,
yp.class_pays
from year_pay yp
where yp.filial = 'Название филиала'
and extract(month from yp.date_pay) = 1
group by yp.naznachenie_pay,
yp.group_pays,
yp.class_pays
) c on c.group_pays = d.id_gp
union all
select d.group_pays, d.class_pays, c.naznachenie_pay,
0.00 as month_1,
case when c.summa is null then 0.00 else c.summa end as month_2,
0.00 as month_3, 0.00 as month_4,
0.00 as month_5, 0.00 as month_6,
0.00 as month_7, 0.00 as month_8,
0.00 as month_9, 0.00 as month_10,
0.00 as month_11, 0.00 as month_12
from (
select group_pays.group_pays, class_pays.class_pays,
group_pays.id as id_gp, class_pays.id as id_cp
from group_pays inner join class_pays
on group_pays.id = class_pays.ref_groups_pays ) d
left outer join
( select
yp.naznachenie_pay,
sum(yp.summa_pay) as summa,
yp.group_pays,
yp.class_pays
from year_pay yp
where yp.filial = 'Название филиала'
and extract(month from yp.date_pay) = 2
group by yp.naznachenie_pay,
yp.group_pays,
yp.class_pays
) c on c.group_pays = d.id_gp
union all
...
ещё 10 раз
...
) e
group by e.group_pays,
e.class_pays,
e.naznachenie_pay
Спасибо за внимание!
Удачи!