SSRS: как сделать сумму, которая включает только последний элемент в группе

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

Place                 = ?                              (Group header 1)
    User              = ?                              (Group header 2)
        Date          =Last(Fields!Number.Value)       (Group header 3)
            Number    =Fields!Number.Value             (Detail row)

Итак, другими словами, в User мне нужна сумма Date... если это имеет смысл...

Numberстроки содержат много чисел на Date. Но Date показывает только последнее число за этот день, потому что остальные не учитываются (но должны отображаться). В User я хочу суммировать эти последние числа для всех дат для этого пользователя. И то же самое с Place (что будет суммой каждого последнего числа за каждый день для каждого пользователя).

Может ли кто-нибудь помочь мне с этим? Я пробовал очевидный (по крайней мере для меня) =Sum(Last(Fields!Number.Value)), но (также пытался указать группу в этих функциях, но не имел значения, потому что) я получаю сообщение об ошибке при попытке скомпилировать, в котором говорится:

Выражение Value для текстового поля 'numberTextbox' содержит агрегатную функцию (или функции RunningValue или RowNumber) в аргументе другой агрегатной функции (или RunningValue). Агрегатные функции не могут быть вложены в другие агрегатные функции.

Что, я думаю, имеет смысл... но как мне это сделать тогда?


Обновление: я решил проблему, добавив еще один столбец и скопировав эти последние числа в этот столбец. Таким образом, я могу отобразить все числа и выполнить суммирование в столбце, содержащем только те, которые будут в сумме. Мне все еще очень любопытно, есть ли у кого-нибудь решение моей первоначальной проблемы ... поэтому, пожалуйста, напишите ответ, если да!


person Svish    schedule 06.05.2009    source источник
comment
Как вы скопируете эти последние числа в этот столбец? У меня также есть группа строк. Решит ли это проблему? Спасибо   -  person ace_mccloud    schedule 02.07.2014


Ответы (3)


Не уверен, что точно понимаю, что вы пытаетесь сделать. Может быть что-то вроде =Last(Fields!Number.Value,"Group 1") + Last(Fields!Number.Value,"Group 2") + Last(Fields!Number.Value,"Group 3"), вместо этого используя сумму функция?

person Mozy    schedule 06.05.2009
comment
Дело в том, что у меня есть набор данных с кучей чисел. Все эти числа отображаются в строках сведений. Эти номера сгруппированы по дате, затем по пользователю, затем по местоположению. И нам нужно иметь сумму для каждого пользователя и сумму для каждого местоположения. Каждое местоположение, конечно, нуждается в сумме каждого пользователя под ним. И каждому местоположению нужна сумма каждой даты. но каждая дата будет отображать только последнее число для этой даты (хотя их может быть много). Таким образом, пользовательская сумма не может суммировать все числа в группе. только последний из каждой даты. Это имело смысл? - person Svish; 06.05.2009
comment
Хорошо... так как насчет того, чтобы использовать ваш пример, =Last(Fields!Number.Value) находится в lastTextBox. А затем =Sum(ReportItems!lastTextBox.Value). Я ближе к тому, что вам нужно? - person Mozy; 07.05.2009
comment
Ну, в теории да, но на практике я получаю ту же ошибку =/ Выражение значения для текстового поля 'sumTextbox' использует агрегатную функцию для элемента отчета. Агрегированные функции можно использовать только для элементов отчета, содержащихся в верхних и нижних колонтитулах страниц. и Выражение значения для текстового поля «sumTextbox» имеет параметр области действия, который недопустим для агрегатной функции. В параметре области должна быть задана строковая константа, равная либо имени содержащей группы, либо имени содержащей области данных, либо имени набора данных. - person Svish; 12.05.2009

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

person DForck42    schedule 06.05.2009
comment
Да, очевидно, но тогда бы не отображались остальные, а они должны быть =) Дело в том, что цифры меняются в течение дня, и отчет должен отображать, как они изменились. Но в сумме нужно учитывать только последнее из этих чисел. - person Svish; 06.05.2009
comment
могу я увидеть ваш запрос? у меня есть смутное представление о том, как это исправить, но мне нужно что-то, чтобы визуализировать это с помощью - person DForck42; 06.05.2009
comment
не могу вставить сюда весь запрос linq нет. Но результирующие строки выглядят примерно так: Place User Date Number1 Number2 Number3 Number4 TimeA TimeB TimeSpanAB. Для каждой строки должны отображаться TimeA и TimeB, а также числа. Но для сумм необходимо учитывать только последнее число на дату. - person Svish; 06.05.2009
comment
ну, вы могли бы сделать это частью фактического вопроса, тогда у вас не было бы ограничения по размеру. - person DForck42; 06.05.2009

Изменение набора данных действительно может быть самым простым решением, но если вы действительно хотите сделать это, не усложняя запрос, вы можете попробовать «пользовательскую агрегацию».

Точные методы для этого зависят от версии SSRS, и я понимаю, что это не очень хорошо работало до SSRS 2008.

Идея состоит в том, что вы пишете некоторый собственный код для поддержки массива, содержащего последнее значение для каждой даты. Одна функция обновляет «последнее значение» даты, а другая суммирует значения в массиве. Ваш заголовок вызывает последнюю функцию; вы договариваетесь о том, чтобы прежняя функция вызывалась один раз для каждой строки сведений перед обработкой заголовка.

Вот блог с описанием техники, используемой в SSRS 2008.

Это также дает некоторое представление о том, как вы можете попытаться заставить это работать в SRSS 2005, но опять же, очевидно, что это не так надежно.

person Mark Adelsberger    schedule 20.12.2011