Come riassumere i valori di tutte le prime righe di sottogruppi in un gruppo durante l'utilizzo di MS SSRS?
-
26-09-2019 - |
Domanda
Nel nostro DB, abbiamo: (x mezzi non importa)
GID UID COST
================================
A 1 100
A 1 x
A 2 200
A 2 x
B 3 330
B 3 x
E il rapporto cliente ha richiesto per assomigliare a:
UID COST
================================
[Group - A]
1 100
1
2 200
2
---Subtotal: 300
[Group - B]
3 330
3 x
---Subtotal: 330
======Total: 630
Ho 2 gruppi nel report SSRS, uno è il gruppo su GID, e uno è gruppo su UID, e ho provato molti modi per riassumere tutto il primo costo di un UID in un gruppo di GID. Ma senza successo.
Se facendo questo in cristallo rapporto, possiamo usare "sul cambiamento gruppo formula" per realizzarla. Ma in SSRS, ho trovato nessun modo per farlo bene.
Si prega di aiuto gentilmente!
Soluzione
È forse necessario tornare alla SQL e creare la colonna che si desidera sommare.
Usando il tuo esempio:
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 funzione row_number richiede SQL 2005 o superiore.
Una soluzione per SQL 2000 sarebbe qualcosa di simile
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
Si noti che la query nidificato nella clausola WHERE è incredibilmente inffecient come deve chiamare quella query per ogni riga della tabella #Rawdata. Ottiene il lavoro fatto, ma a quale costo?
Se non lo fa causare problemi di prestazioni a livelli di produzione dei dati, potrebbe essere a posto.