2

В нашей БД, мы имеем: (х означает, что не все равно)Как суммировать значения всех первых строк подгрупп в группе при использовании MS SSRS?

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

И отчет клиент должен выглядеть следующим образом:

UID COST 
================================ 
[Group - A] 
    1 100 
    1  
    2 200 
    2  
    ---Subtotal: 300 
[Group - B] 
    3 330 
    3 x 
    ---Subtotal: 330 
         ======Total: 630 

Я 2 группы в докладе SSRS, одна из них - группа в GID, а одна - группа по UID, и я попытался много способов суммировать все первые COST UID в группе GID. Но успеха нет.

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

Просьба любезно помочь!

+0

@Mark, я новичок в Stackoverflow, действительно, я попытался оценить ответ, но система не позволяет мне это делать ...>< –

+0

@Mark, я сказал Stackoverflow.com о моей ситуации «Mark/Vote», и теперь я могу «принять ответ». Большое спасибо. –

ответ

0

Возможно, вам придется вернуться к 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 

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

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

+0

Спасибо, так я и нашел, но я не могу применить это в среде компании, так как мы используем SQL Server 2000. –

+0

Не довольно взломать, но он выполняет свою работу. – Nat

 Смежные вопросы

  • Нет связанных вопросов^_^