Comment résumer les valeurs de toutes les premières lignes de sous-groupes dans un groupe tout en utilisant MS SSRS?

StackOverflow https://stackoverflow.com/questions/4223607

Question

Dans notre DB, nous avons: (x signifie ne se soucient pas)

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, un groupe est sur le GID, et un groupe est sur UID, et je l'ai essayé plusieurs façons de résumer tout le premier coût d'un UID dans un groupe de GID. Mais sans succès.

Si ce faisant dans le rapport de cristal, nous pouvons utiliser « sur la formule de changement de groupe » pour y parvenir. Mais dans SSRS, j'ai trouvé aucun moyen de le faire correctement.

S'il vous plaît aider de bien vouloir!

Était-ce utile?

La solution

Vous avez peut-être revenir à la SQL et créer la colonne que vous voulez résumer.

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 row_number nécessite SQL 2005 ou plus.

Une solution de contournement pour serait quelque chose comme 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

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. Fait le travail, mais à quel prix?

Si elle ne provoque pas des problèmes de performance au niveau de la production de données, vous pouvez bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top