2011-11-11 11 views
13

Con questo insieme di dati:Come combinare aggregati all'interno di un gruppo con aggregati tra i gruppi all'interno di SSRS

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

Voglio creare un Tablix raggruppamento su categoria, visualizzando la percentuale del totale:

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

che dovrebbe essere un semplice calcolo:

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)% 

Ma io non riesco a capire come fare all'interno di Re port Designer (SSRS) - ogni volta che creo un raggruppamento di righe su Category, posso ottenere la somma all'interno del gruppo con =Sum(Fields!Amount.Value). Ma come ottenere la somma attraverso i gruppi da una cella all'interno del gruppo?

risposta

26

Risponderò alla mia domanda.

Da qualsiasi espressione è possibile eseguire ricerche in tutti i set di dati. Attraverso questo modo avremo i dati:

LookupSet(SourceFieldToCompare, TargetFieldToCompare, ResultField, DataSet) 

Ora, cerchiamo di alzare il livello della domanda e dicono che i dati sono raggruppati in un'altra dimensione, mesi - in questo modo:

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

Say il set di dati menzionato nella domanda è chiamato 'categorie'. Ora, chiamare la funzione LookupSet (Reference):

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

(tenere a mente che il primo "Mese" è legata al set di dati all'interno della Tablix, e la seconda "Month" nel secondo argomento è "Mese "dal set di dati" categorie ")

Rimane un problema: LookupSet restituisce i tipi Object, che non verranno mangiati da Sum. È necessario utilizzare un aggregato personalizzato, (codice personalizzato viene aggiunto in "Proprietà Report"): (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 

Ora, chiamando Code.SumLookup sulla funzione LookupSet la somma viene calcolata su tutti i campi.

+3

+1 Seriamente questo mi ha fatto impazzire - perché mai ti darebbero la funzione LookupSet che non funziona con Sum agg! –

2

Si potrebbe avere utilizzato descrittori scopo di identificare i gruppi che la somma deve essere eseguito contro:

  • gruppo Categoria è definito in gruppi tablix Row.
  • DataSet1 è il nome del set di dati.

Importo raggruppato: [Sum (Somma)]

Dataset Totale: SUM (Campi Amount.Value, "DataSet1"!)

Percentuale: SUM (Campi Amount.Value, "Categoria ") /SUM(Fields! Amount.Value," DataSet1 ")