Подтвердить что ты не робот

Как объединить агрегаты внутри группы с агрегатами по группам в SSRS

С помощью этого набора данных:

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

Я хочу создать группировку tablix по категории, отображающую процент от общей суммы:

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

Какой должен быть простой расчет:

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

Но я не могу понять, как это сделать в Report Designer (SSRS) - всякий раз, когда я создаю группировку строк на Category, я могу получить сумму внутри группы с помощью =Sum(Fields!Amount.Value). Но как получить сумму по группам из ячейки внутри группы?

4b9b3361

Ответ 1

Я отвечу на свой вопрос.

Из любого выражения можно выполнять поиск во всех наборах данных. Таким образом мы получим данные:

LookupSet(SourceFieldToCompare, TargetFieldToCompare, ResultField, DataSet)

Теперь позвольте поднять планку вопроса и сказать, что данные сгруппированы в еще одно измерение, месяцы - вот так:

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

Скажите, что набор данных, упомянутый в вопросе, называется "категориями". Теперь вызовите функцию LookupSet (Ссылка):

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

(помните, что первый "месяц" связан с набором данных внутри таблицы, а второй "месяц" во втором аргументе - "месяц" из набора данных "категории"!)

Остается одна проблема: LookupSet возвращает типы Object, которые Sum не будут есть. Вам нужно использовать настраиваемый агрегат (в "Свойства отчета" добавлен специальный код): (Источник)

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

Теперь, вызывая Code.SumLookup в функции LookupSet, сумма вычисляется из всех полей.

Ответ 2

Вы могли бы использовать дескрипторы Scope для идентификации групп, с которыми должен работать СУММ:

  • Группа категорий определена в группах строк tablix.
  • DataSet1 - это имя набора данных.

Сгруппированное количество: [Сумма (сумма)]

Набор данных Total: SUM (Fields! Amount.Value, DataSet1)

Процент: SUM (Fields! Amount.Value, "Category" )/SUM(Fields!Amount.Value, "DataSet1" )