Calcul des totaux généraux à partir des totaux de groupe dans Reporting Services
-
03-07-2019 - |
Question
J'ai des données regroupées dans une table selon un certain critère et pour chaque groupe, elle est calculée comme une moyenne - eh bien, le cas réel est un peu plus compliqué - des valeurs de chacune des lignes de détail appartenant à celle-ci. groupe. Cette moyenne est indiquée dans les lignes de chaque pied de groupe. Voyons cet exemple simple:
Ce que je veux maintenant, c’est afficher un total général dans le pied de page du tableau . Le total général doit être calculé en ajoutant la moyenne de chaque groupe (par exemple, dans cet exemple, le total général doit être de 20 + 15 = 35). Cependant, je ne peux pas imbriquer de fonctions d'agrégat. Comment puis-je faire?
La solution
Reporting Services (2005, peut-être 2008 également) ne prend pas directement en charge les agrégats d'agrégats.
Utilisez un assemblage de rapport personnalisé, des références de code et des objets nommés (Propriétés du rapport, Références) qui vous permettent d'agréger les valeurs vous-même.
Votre code pourrait ressembler à ceci:
Public Sub New()
m_valueTable = New DataTable(tableName:="DoubleValueList")
'Type reference to System.Double
Dim doubleType = Type.GetType(typeName:="System.Double")
' Add a single Double column to hold values
m_valueTable.Columns.Add(columnName:="Value", type:=doubleType)
' Add aggregation column
m_sumColumn = m_valueTable.Columns.Add(columnName:="Sum", type:=doubleType, expression:="Sum(Value)")
End Sub
Public Function Aggregate(ByVal value As Double) As Double
' Appends a row using a 1-element object array.
' If there will be more than 1 column, more values need to be supplied respectively.
m_valueTable.Rows.Add(value)
Aggregate = value
End Function
Public ReadOnly Property Sum() As Double
Get
If 0 = m_valueTable.Rows.Count Then
Sum = 0
Else
Sum = CDbl(m_valueTable.Rows(0)(m_sumColumn))
End If
End Get
End Property
Nommez-vous par exemple DoubleAggregator. Remplacez ensuite les expressions de groupe par "Code.DoubleAggregator.Aggregate (Avg (Fields! Column2.Value))" " et l'expression de Total avec "Code.DoubleAggregator.Sum ()".
Autres conseils
Vous devez simplement ajouter la fonction SUM () dans le pied de table, qui est la portée extérieure des deux groupes et qui les additionnera tous. Si vous faites la somme sur une condition, vous devrez peut-être la mentionner également.
Malheureusement, je suis loin de ma boîte de développement de rapports pour le moment, mais c'est soit:
= (sum (Fields! Column1 + sum (Champs! Column2)))
OU
= SOMME (somme (Champs! Colonne1) + somme (Champs! Colonne2))
Je suis presque sûr que c'est le premier des 2.
Vous ne pouvez pas vraiment, mais vous pouvez tromper. J'ai bloogué une solution à ceci ici: http://dataqueen.unlimitedviz.com/2011/05/ssrs-aggregate-last-ytd-or-last-child-value-in-an-ssas-query/
vous pouvez simplement faire comme suit: Sum (CInt (Fields! TestValue.Value)) ou Sum (CInt (Fields! DollarAmountOfCheck.Value), "DataSet1") Parfois, lorsque les données arrivent via WCF, il n’accepte pas la fonction Sum (). mais cela fonctionne bien dans ce cas.