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

#reporting-services #aggregate-functions

#службы отчетов #агрегатные функции

Вопрос:

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

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

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

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

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

Ответ №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 , вычисляется сумма всех полей.

Комментарии:

1. 1 Серьезно, это сводит меня с ума — с какой стати им предоставлять вам функцию LookupSet, которая не работает с Sum agg!

Ответ №2:

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

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

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

Общий набор данных: СУММА (поля!Количество.Значение, «DataSet1»)

Процент: СУММА (полей!Количество.Значение, «Категория») / СУММА (полей!Количество.Значение, «DataSet1»)