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

Откуда: Донецк
Сообщений: 192
Здравствуйте, уважаемые коллеги. Нужна ваша помощь.
Есть таблица TT с полями: yy,mm,serv,vhod,nach,opl,ishod.
ГодМесяцуслугавход. сальдоначисленооплаченоисход. сальдо
20131110010050150
2013161010515
20132115010050200
2013261510520

Результат должен быть в виде:
ГодМесяцуслугавход. сальдоначисленооплаченоисход. сальдо
20131110010050150
2013161010515
20131null11011055165
20132115010050200
2013261510520
20132null16511055220
2013null1100200100200
2013null610201020
2013nullnull110220110220

Жирным выделены цифры, которые необходимо получить правильно, а не суммированием как для полей Начислено и Оплачено.
Правильно означает: входящее сальдо по итогу на 1-ый месяц и исходящее сальдо на последний месяц (в данном случае на 2-ой месяц).
Используется такой запрос:
select yy,mm,serv,sum(vhod) vhod,sum(nach) nach,sum(opl) opl,sum(ishod) ishod
from
(
select 1 serv,2013 yy,1 mm,100 vhod,100 nach,50 opl,150 ishod
union all
select 6 serv,2013 yy,1 mm,10 vhod,10 nach,5 opl,15 ishod
union all
select 1 serv,2013 yy,2 mm,150 vhod,100 nach,50 opl,200 ishod
union all
select 6 serv,2013 yy,2 mm,15 vhod,10 nach,5 opl,20 ishod
order by 2,3,1
) tt
group by grouping sets ((yy),(yy,mm),(yy,serv),(yy,mm,serv))
order by yy,isnull(mm,1000),isnull(serv,99)

Запрос некорректен, т.к. не нужно суммировать входящее и исходящее сальдо.
Как написать правильно этот запрос ?
Заранее спасибо за советы.
11 окт 13, 17:32    [14957861]     Ответить | Цитировать Сообщить модератору
 Re: Группирование данных  [new]
prog882
Guest
lioner, может так?

with t as (
select 1 serv,2013 yy,1 mm,100 vhod,100 nach,50 opl,150 ishod union all
select 6 serv,2013 yy,1 mm, 10 vhod, 10 nach, 5 opl, 15 ishod union all
select 1 serv,2013 yy,2 mm,150 vhod,100 nach,50 opl,200 ishod union all
select 6 serv,2013 yy,2 mm, 15 vhod, 10 nach, 5 opl, 20 ishod)

select
yy, mm, serv, 
vhod=case when mm is null then sum(vhod2) else sum(vhod) end, 
nach=sum(nach), 
opl=sum(opl), 
ishod=case when mm is null then sum(ishod2) else sum(ishod) end
from (
select yy,mm,serv,vhod,nach,opl,ishod,
vhod2=case when min(mm) over(partition by yy,serv) = mm then vhod else 0 end,
ishod2=case when max(mm) over(partition by yy,serv) = mm then ishod else 0 end
from t
) tb
group by grouping sets ((yy),(yy,mm),(yy,serv),(yy,mm,serv))
order by yy, isnull(mm,13), isnull(serv,9999)
14 окт 13, 09:34    [14964746]     Ответить | Цитировать Сообщить модератору
 Re: Группирование данных  [new]
lioner
Member

Откуда: Донецк
Сообщений: 192
prog882
lioner, может так?

with t as (
select 1 serv,2013 yy,1 mm,100 vhod,100 nach,50 opl,150 ishod union all
select 6 serv,2013 yy,1 mm, 10 vhod, 10 nach, 5 opl, 15 ishod union all
select 1 serv,2013 yy,2 mm,150 vhod,100 nach,50 opl,200 ishod union all
select 6 serv,2013 yy,2 mm, 15 vhod, 10 nach, 5 opl, 20 ishod)

select
yy, mm, serv, 
vhod=case when mm is null then sum(vhod2) else sum(vhod) end, 
nach=sum(nach), 
opl=sum(opl), 
ishod=case when mm is null then sum(ishod2) else sum(ishod) end
from (
select yy,mm,serv,vhod,nach,opl,ishod,
vhod2=case when min(mm) over(partition by yy,serv) = mm then vhod else 0 end,
ishod2=case when max(mm) over(partition by yy,serv) = mm then ishod else 0 end
from t
) tb
group by grouping sets ((yy),(yy,mm),(yy,serv),(yy,mm,serv))
order by yy, isnull(mm,13), isnull(serv,9999)


Спасибо. Это то, что требовалось.
15 окт 13, 10:33    [14971140]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить