2011-11-11 15 views
13

Con este conjunto de datos:¿Cómo combinar los agregados dentro de un grupo con agregados en todos los grupos dentro de SSRS

Category | Amount 
A  | 5 
A  | 3 
B  | 6 
B  | 2 
B  | 1 
C  | 7 

Quiero crear una tablix agrupar en categorías, que muestra el porcentaje de la cantidad total:

Category | Percentage 
A  | 33% 
B  | 38% 
C  | 29% 

que debería ser un simple cálculo:

Category | Percentage 
A  | ((Sum of Amount within group/Sum of Amount across groups) * 100)% 
B  | ((Sum of Amount within group/Sum of Amount across groups) * 100)% 
C  | ((Sum of Amount within group/Sum of Amount across groups) * 100)% 

pero no puedo encontrar la manera de hacer que dentro de Re Port Designer (SSRS): cada vez que creo una agrupación de filas en Category, puedo obtener la suma dentro del grupo con =Sum(Fields!Amount.Value). Pero, ¿cómo obtener la suma a través de los grupos de una celda dentro del grupo?

Respuesta

26

Voy a responder mi propia pregunta.

Desde cualquier expresión, es posible realizar búsquedas en todos los conjuntos de datos. A través de esta forma obtendremos los datos:

LookupSet(SourceFieldToCompare, TargetFieldToCompare, ResultField, DataSet) 

Ahora, vamos a subir el listón de la pregunta y dicen que los datos se agrupan en otra dimensión, meses - como esto:

Category | January | February | March 
A  | 33%  | 37%  | 35% 
B  | 38%  | 36%  | 37% 
C  | 29%  | 27%  | 28% 

Say el conjunto de datos mencionado en la pregunta se denomina 'categorías'. Ahora, llama a la función LookupSet (Reference):

LookupSet(Fields!Month.Value, Fields!Month.Value, Fields!Amount.Value, "categories") 

(tenga en cuenta que el primer "Mes" está vinculado al conjunto de datos dentro de la tablix, y el segundo "Mes" en el segundo argumento es el "Mes "del conjunto de datos" categorías ")

Queda un problema: LookupSet devuelve Object tipos, que Sum no se comen. Es necesario utilizar un agregado de encargo, (se añade el código personalizado en "Propiedades del informe"): (Source)

Function SumLookup(ByVal items As Object()) As Decimal 
    If items Is Nothing Then 
    Return Nothing 
    End If 

    Dim suma As Decimal = New Decimal() 
    suma = 0 

    For Each item As Object In items 
    suma += Convert.ToDecimal(item) 
    Next 

    Return suma 
End Function 

Ahora, llamando Code.SumLookup en la función LookupSet la suma se calcula de todos los campos.

+3

+1 En serio, esto me está volviendo loco. ¿Por qué demonios le darían la función LookupSet que no funciona con Sum agg! –

2

Se podría haber utilizado los descriptores de ámbito para identificar los grupos que la suma se va a ejecutar en contra:

  • grupo de categoría se define en los Grupos tablix fila.
  • DataSet1 es el nombre del conjunto de datos.

Monto Agrupados: [Sum (Cantidad)]

total de datos: SUMA (campos Amount.Value, "DataSet1"!)

Porcentaje: SUMA (campos Amount.Value, "Categoría ") /SUM(Fields!Amount.Value," DataSet1 ")

Cuestiones relacionadas