2

Dans notre DB, nous avons: (x signifie ne se soucient pas)Comment faire pour récapituler les valeurs de toutes les premières lignes de sous-groupes dans un groupe tout en utilisant MS SSRS?

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

Et le rapport client requis pour ressembler à:

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

J'ai 2 groupes dans le rapport SSRS, l'un est un groupe sur GID, et l'autre est un groupe sur UID, et j'ai essayé plusieurs façons de résumer tout le premier COST d'un UID dans un groupe de GID. Mais pas de succès. Si cela est fait dans le rapport Crystal, nous pouvons utiliser "sur la formule de changement de groupe" pour le réaliser. Mais dans SSRS, je n'ai trouvé aucun moyen de le faire correctement.

S'il vous plaît veuillez nous aider!

+0

@Mark, je suis nouveau à Stackoverflow, en effet, j'ai essayé d'évaluer la réponse, mais le système ne me permet pas de le faire ...>< –

+0

@Mark, je l'ai dit à la Stackoverflow.com sur ma situation "Mark/Vote", et maintenant je suis en mesure d '"accepter la réponse". Merci beaucoup. –

Répondre

0

Vous devrez peut-être revenir à SQL et créer la colonne que vous souhaitez additionner.

En utilisant votre exemple:

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 

La fonction nécessite row_number SQL 2005 ou plus.

Une solution de contournement pour SQL 2000 serait quelque chose comme

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 

Notez que la requête imbriquée dans la clause where est incroyablement inffecient car il doit appeler cette requête pour chaque ligne de la table #Rawdata. Obtient le travail, mais à quel prix?

Si cela ne cause pas de problèmes de performance au niveau des données de production, cela peut vous convenir.

+0

Merci, c'est la façon dont j'ai trouvé, mais je ne peux pas appliquer cela dans l'environnement de l'entreprise puisque nous utilisons SQL Server 2000. –

+0

Pas un hack, mais il fait le travail. – Nat