Недавно поменял работу. Здесь работаю на 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

Спасибо за внимание!
Удачи!

Ответить