¿Cómo resumir los valores de todas las primeras filas de los subgrupos dentro de un grupo, mientras que el uso de MS SSRS?

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

Pregunta

En nuestra base de datos, tenemos: (x medios no les importa)

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

Y el informe pedido por el cliente para parecerse a:

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

Tengo 2 grupos en el informe de SSRS, uno es el grupo GID, y uno es un grupo de UID, y he probado muchas maneras de resumir todo el costo inicial de un UID en un grupo de GID. Pero sin éxito.

Si haciendo esto en el informe de cristal, podemos utilizar "sobre el cambio fórmula grupo" para lograrlo. Pero en SSRS, no he encontrado ninguna manera de hacerlo bien.

Por favor, amablemente ayuda!

¿Fue útil?

Solución

puede que tenga que volver a SQL y crear la columna que desea resumir.

Usando su ejemplo:

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 función row_number requiere SQL 2005 o superior.

Una solución para SQL 2000 sería algo así como

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

Tenga en cuenta que la consulta anidada en la cláusula where es increíblemente inffecient ya que tiene que llamar a esa consulta para cada fila de la tabla #Rawdata. Se hace el trabajo, pero ¿a qué costo?

Si no es causa de problemas de rendimiento en los niveles de producción de datos, puede estar bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top