¿Cómo resumir los valores de todas las primeras filas de los subgrupos dentro de un grupo, mientras que el uso de MS SSRS?
-
26-09-2019 - |
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!
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.