Как суммировать значения всех первых строк подгрупп в группе при использовании MS SSRS? - PullRequest
2 голосов
/ 19 ноября 2010

В нашей БД у нас есть: (x означает, что все равно)

GID   UID    COST
================================
A   1    100
A   1    x
A   2    200
A   2    x
B   3    330
B   3    x

И отчет клиента должен выглядеть так:в отчете SSRS один - группа по GID, а другой - группа по UID, и я попробовал много способов суммировать все первые COST UID в группе GID.Но безуспешно.

Если вы делаете это в отчете Crystal, мы можем использовать «формулу смены группы» для ее достижения.Но в SSRS я не нашел способа сделать это правильно.

Пожалуйста, помогите!

1 Ответ

0 голосов
/ 30 ноября 2010

Возможно, вам придется вернуться к SQL и создать столбец, который вы хотите суммировать.

Используя ваш пример:

select 
    GID,
    UID,
    Cost,
    case when row_number()  over(partition by GID,UID ORDER BY GID,UID,Cost) = 1 then Cost else 0 end as firstCostGroup
from
(
    select 'a' as GID, 1 as UID, 100 as Cost
    union
    select 'a', 1, 101
    union
    select 'a', 2, 200
    union
    select 'a', 2, 201
    union
    select 'b', 3, 300
    union
    select 'b', 3, 301 
) as rawdata

Функция row_number требует SQL 2005 или выше.

Обходной путь для SQL 2000 будет выглядеть примерно так:

drop table #RawData
go
drop table #RawDataFirstRows
GO
create table #RawData
(
id int identity(1,1),
GID varchar(10),
UID int,
Cost int
)

insert into #RawData
    select 'a' as GID, 1 as UID, 100 as Cost 
    union 
    select 'a', 1, 101 
    union 
    select 'a', 2, 200 
    union 
    select 'a', 2, 201 
    union 
    select 'b', 3, 300 
    union 
    select 'b', 3, 301  

create table #RawDataFirstRows
(
id int
)

insert into #RawDataFirstRows
select
rd.id
from #RawData rd
where
rd.id = (select top 1 id from #RawData rw where rd.uid = rw.uid and rd.gid = rw.gid order by rw.gid,rw.uid)


select
rd.GID, rd.UID, rd.Cost, case when rw.id is null then 0 else 1 end as firstCostGroup
from
#RawData rd
left join
#RawDataFirstRows rw on rd.id = rw.id

Обратите внимание, что вложенный запрос в предложении where невероятно бессмыслен, поскольку он должен вызывать этот запрос для каждой строки в таблице #Rawdata,Выполняет работу, но какой ценой?

Если это не вызывает проблем с производительностью на производственных уровнях данных, вы можете быть в порядке.

...