#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»)