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!

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top