Расчет общих итогов по групповым итогам в службах Reporting Services - PullRequest
3 голосов
/ 17 октября 2008

У меня есть некоторые данные, сгруппированные в таблице по определенным критериям, и для каждой группы вычисляется среднее - ну, реальный случай немного сложнее - значений из каждой строки подробностей, которые принадлежат этому группа. Это среднее значение отображается в каждой строке нижнего колонтитула группы. Давайте посмотрим на этот простой пример:

Report table

Теперь я хочу показать общий итог в нижнем колонтитуле таблицы . Общая сумма должна быть вычислена путем сложения среднего значения для каждой группы (например, в этом примере общая сумма должна составлять 20 + 15 = 35). Однако я не могу вкладывать агрегатные функции. Как я могу это сделать?

Ответы [ 5 ]

3 голосов
/ 20 ноября 2008

Вам просто нужно добавить функцию SUM () в нижний колонтитул таблицы, которая является внешней областью действия обеих групп и суммирует их все вместе. Если вы суммируете условие, вам, возможно, понадобится указать и его.

2 голосов
/ 20 ноября 2008

Службы Reporting Services (2005, а может и 2008 год) не поддерживают агрегаты агрегатов напрямую.

Используйте пользовательскую сборку отчета, ссылки на код и именованные объекты (Свойства отчета, Ссылки), которые позволяют самостоятельно агрегировать значения.

Ваш код может выглядеть так:

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

Имя, на которое вы ссылаетесь, например, DoubleAggregator. Затем замените групповые выражения на «Code.DoubleAggregator.Aggregate (Avg (Fields! Column2.Value))», а выражение для Total на «Code.DoubleAggregator.Sum ()».

1 голос
/ 18 августа 2013

вы можете просто сделать следующее: Сумма (CInt (Fields! TestValue.Value)) или сумма (CInt (Fields! DollarAmountOfCheck.Value), "DataSet1") Иногда, когда данные поступают через WCF, они не принимают функцию Sum (). но это прекрасно работает в этом случае.

1 голос
/ 05 июня 2011

Вы не можете на самом деле, но вы можете обмануть это. Я нашел решение этой проблемы здесь: http://dataqueen.unlimitedviz.com/2011/05/ssrs-aggregate-last-ytd-or-last-child-value-in-an-ssas-query/

1 голос
/ 20 октября 2008

К сожалению, на данный момент я удален от своего окна разработки отчетов, но это либо:
= (сумма (поля! Столбец1 + сумма (поля! Столбец2))
ИЛИ
= СУММА (сумма (Поля! Столбец1) + сумма (Поля! Столбец2))

Я уверен, что это первый из 2.

...