Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Не могу сделать запос или программу по подсчету сложной суммы из таблицы  [new]
stim24
Member

Откуда: Иркутск
Сообщений: 173
Задача следующая.
Есть таблица doc_cost (таблица расходов)
структура:
id int
idpodr int  - id подразделения
dateperiod datetime - период
summa numrec(13,2) - сумма
akey char (10) - тип расхода
Например она такая
id idpodr  dateperiod  summa akey
--------------------
1  -1     01.01.2008     1     1 
2  1      01.01.2008     2     2
3  2      01.01.2008     3     1
4  -1     01.01.2009     4     1
5  1      01.01.2009     5     2
6  2      01.01.2009     7     2
Есть еще таблица v_cashmonf
id - id
idpodr int   - код подразделения
pr     float  - процент (коэффициент)
monf int   - месяц периода
god int    - год периода
Если idpodr=-1 это означает общие расходы на все подразделения

Так вот мне надо посчитать следующие.
Чтобы на выходе из таблицы doc_cost был посчитана сумма по idpodr=-1 тоесть
просто сумма всех расходов за период
получается
 idpodr  dateperiod  summa
--------------------
 -1     01.01.2008     6      
  -1    01.01.2009     16      
Это легко
select sum(summa) as summa, dateperiod, -1 as idpodr from doc_cost group by dateperiod
но проблема в следующем:
Плюс в эту таблицу надо чтобы добавились итоги по подразделениям, но в каждый итог по подразделению надо надо включать сумму общего расхода idpodr=-1 умноженный на v_cashfmonf.pr ну пусть он всегда пока равен 1. хотя бы просто его суммировать
тоесть должно получиться
idpodr  dateperiod  summa 
--------------------
 -1    01.01.2008     6      =1+2+3
 -1    01.01.2009     16      =4+5+7
  1    01.01.2008      3       =1+2
  2    01.01.2008      4       =1+3
  1    01.01.2009      9       =4+5
  2    01.01.2009      11     =4+5
Попытался как можно доступнее объяснить как смог)
Есть идее как это сделать?
заранее благодарен
23 сен 09, 06:31    [7695735]     Ответить | Цитировать Сообщить модератору
 Re: Не могу сделать запос или программу по подсчету сложной суммы из таблицы  [new]
aleks2
Guest
DISCLAIMER: Предполагается, что сумма v_cashmonf.pr =1

select sum(summa) as summa, dateperiod, -1 as idpodr from doc_cost group by dateperiod
UNION ALL
select SUM(summa) summa, dateperiod, idpodr
FROM
	(select T.summa*V.pr summa, T.dateperiod, V.idpodr
		FROM
		(select sum(summa) as summa, dateperiod, -1 as idpodr from doc_cost WHERE idpodr=-1 group by dateperiod) T
		INNER JOIN
		v_cashmonf V
		ON T.dateperiod=dateadd(month, V.monf-1, dateadd(year, V.god-1900, 0))
	UNION ALL
	select sum(summa) as summa, dateperiod, idpodr from doc_cost WHERE idpodr<>-1 group by dateperiod, idpodr
	) Z
group by dateperiod, idpodr
23 сен 09, 06:49    [7695750]     Ответить | Цитировать Сообщить модератору
 Re: Не могу сделать запос или программу по подсчету сложной суммы из таблицы  [new]
aleks2
Guest
DISCLAIMER: -/- за каждый период.

Можно попроще

select sum(summa) as summa, dateperiod, -1 as idpodr from doc_cost group by dateperiod
UNION ALL
select SUM(summa) summa, dateperiod, idpodr
FROM
	(select T.summa*V.pr summa, T.dateperiod, V.idpodr
		FROM
		(select sum(summa) as summa, dateperiod, -1 as idpodr from doc_cost WHERE idpodr=-1 group by dateperiod) T
		INNER JOIN
		v_cashmonf V
		ON T.dateperiod=dateadd(month, V.monf-1, dateadd(year, V.god-1900, 0))
	UNION ALL
	select summa, dateperiod, idpodr from doc_cost WHERE idpodr<>-1
	) Z
group by dateperiod, idpodr
23 сен 09, 06:52    [7695753]     Ответить | Цитировать Сообщить модератору
 Re: Не могу сделать запос или программу по подсчету сложной суммы из таблицы  [new]
stim24
Member

Откуда: Иркутск
Сообщений: 173
use test
create table #doc_cost (id int,idpodr int,dateperiod datetime,
summa numeric(13,2),
akey char (10))

create table #v_cashmonf (id int,idpodr int,pr float, monf int, god int)

insert into #doc_cost (id,idpodr,dateperiod,summa,akey)
values (1,-1,'01.01.2008',1,1)
insert into #doc_cost (id,idpodr,dateperiod,summa,akey)
values (2, 1,'01.01.2008',2,2)
insert into #doc_cost (id,idpodr,dateperiod,summa,akey)
values (3, 2,'01.01.2008',3,1)
insert into #doc_cost (id,idpodr,dateperiod,summa,akey)
values (4,-1,'01.01.2009',4,1)
insert into #doc_cost (id,idpodr,dateperiod,summa,akey)
values (5, 1,'01.01.2009',5,2)
insert into #doc_cost (id,idpodr,dateperiod,summa,akey)
values (6, 2,'01.01.2009',7,2)

--select * from #doc_cost

insert into #v_cashmonf (idpodr, pr, monf, god)
values (1,1,1,2008)
insert into #v_cashmonf (idpodr, pr, monf, god)
values (1,2,1,2008)
insert into #v_cashmonf (idpodr, pr, monf, god)
values (1,1,1,2009)
insert into #v_cashmonf (idpodr, pr, monf, god)
values (1,2,1,2009)

--select * from #v_cashmonf

select sum(summa) as summa, dateperiod, -1 as idpodr from #doc_cost group by dateperiod
UNION ALL
select SUM(summa) summa, dateperiod, idpodr
FROM
	(select T.summa*V.pr summa, T.dateperiod, V.idpodr
		FROM
		(select sum(summa) as summa, dateperiod, -1 as idpodr from #doc_cost WHERE idpodr=-1 group by dateperiod) T
		INNER JOIN
		#v_cashmonf V
		ON T.dateperiod=dateadd(month, V.monf-1, dateadd(year, V.god-1900, 0))
	UNION ALL
	select sum(summa) as summa, dateperiod, idpodr from #doc_cost WHERE idpodr<>-1 group by dateperiod, idpodr
	) Z
group by dateperiod, idpodr

drop table #doc_cost
drop table #v_cashmonf

Результат то не тот
23 сен 09, 11:05    [7696482]     Ответить | Цитировать Сообщить модератору
 Re: Не могу сделать запос или программу по подсчету сложной суммы из таблицы  [new]
aleks2
Guest
Дарагой, я не раздаю рыбу, я учу ее ловить.

Предложенный запрос весьма прост и легко разлагается на составные части. Вот и поправь.

select sum(summa) as summa, dateperiod, -1 as idpodr from #doc_cost group by dateperiod
--UNION ALL
--select SUM(summa) summa, dateperiod, idpodr
--FROM
--	(
	 select T.summa*V.pr summa, T.dateperiod, V.idpodr
		FROM
		(select sum(summa) as summa, dateperiod, -1 as idpodr from #doc_cost WHERE idpodr=-1 group by dateperiod) T
		INNER JOIN
		#v_cashmonf V
		ON T.dateperiod=dateadd(month, V.monf-1, dateadd(year, V.god-1900, 0))
--	UNION ALL
	select sum(summa) as summa, dateperiod, idpodr from #doc_cost WHERE idpodr<>-1 group by dateperiod, idpodr
--	) Z
--group by dateperiod, idpodr

А то может мне и зарплату за тя получить?
23 сен 09, 13:03    [7697278]     Ответить | Цитировать Сообщить модератору
 Re: Не могу сделать запос или программу по подсчету сложной суммы из таблицы  [new]
KoViVl
Member

Откуда:
Сообщений: 7
Привет, stim24!

Тебе нужно сделать декартово произведение двух запросов (один с =-1, другой с <>-1) и сложить их суммы с учетом периодов.

select s1.summa+s2.summa as summa,s1.dateperiod, s1.idpodr 
from (
          select sum(summa) as summa, dateperiod, idpodr
          from doc_cost
          where idpodr<>-1
          group by dateperiod, idpodr
        ) s1
        cross join 
        (
          select sum(summa) as summa, dateperiod, idpodr
          from doc_cost
          where idpodr=-1
          group by dateperiod, idpodr
        ) s2
where s1.dateperiod=s2.dateperiod

Результат этого запроса:
суммарные итоги по периодам по каждому подразделению
с включенными в сумму общими итогами по тем же периодам.
Учет коэффициента разумеется не сделал))
24 сен 09, 03:35    [7700835]     Ответить | Цитировать Сообщить модератору
 Re: Не могу сделать запос или программу по подсчету сложной суммы из таблицы  [new]
KoViVl
Member

Откуда:
Сообщений: 7
Хотя с декартовым, это я че то загнул))
В данном случае и простое соединение подойдет

select ...
from (...) s1 inner join (...) s2 on s1.dateperiod=s2.dateperiod

Результат будет тот же.
24 сен 09, 03:48    [7700837]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить