Необходимо скопировать общую сумму динамических столбцов SSRS и использовать ее в другом расчете.

Я работаю над матричным отчетом, в котором нам нужно рассчитать разницу с начала года между прошлым годом и текущим годом для каждой группы категорий. Теперь я сгенерировал общую сумму за текущий год и предыдущий год для каждой категории. Теперь мне нужно использовать эту общую сумму в другом расчете. Как я могу этого добиться? Любая помощь будет оценена по достоинству.

Например: за 2014 год для категории А общая сумма составляет 1000, а общая сумма за то же самое в 2015 году составляет 1200.

Здесь мне нужны значения 1000 и 1200 для дальнейшего расчета. Есть ли метод или выражение для достижения того же?

There are n number of categories for an year, so each category would be having a Grand Total for each year. 

пример данных

          Search           Website  
Month     2014      2015   2014   2015
January   376       306    489    649
February  295       167    439    534
March     245       206    425    609
April     425       241    465    597
May       313       269    524    845
June      346       285    497    686
July      372       243    509    636
August    410       349    523    753
September 409       296    442    642
October   288       267    475    446
November  169       315 
December  101       347 
GTotal    3,749     2,629  5,450  6,397

% vs 2014           -30%          17%
% YTD vs 2014       -26%          38%

Здесь общая сумма за 2014 год = 3749, а за 2015 год = 2629. И формула для расчета значения дисперсии: (2629-3749)/3749


person Sandeep T    schedule 12.11.2015    source источник
comment
Можете ли вы обновить свой вопрос, чтобы привести пример вашего текущего вывода (изображение через imgur?) И что вы хотели бы сделать для расчета (например, в новом столбце определите значение 2015 – значение 2014 года)   -  person Jonnus    schedule 12.11.2015
comment
отредактировал комментарий, но напутал с форматированием.   -  person Sandeep T    schedule 12.11.2015


Ответы (1)


Ох, это было сложно, но это выполнимо. Я предполагаю, что вы делаете это в матрице, и набор данных выглядит примерно так

Month     Year  Category    Value
--------- ----- ----------- -----
January   2014  Search      376
January   2015  Search      306
February  2014  Search      295
February  2015  Search      167
March     2014  Search      245
March     2015  Search      206
January   2015  Website     489

Тогда довольно просто получить макет, который вам нужен для отображения значений в месяц в год. Каждый «Месяц» — это отдельная группа строк. Каждый «Год» — это отдельная группа столбцов, а сами годы содержатся в родительской группе «Тип». Сумма значений вычисляется с помощью выражения

=Sum(Fields!Val.Value)

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

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

Щелкните правой кнопкой мыши текст отчета, выберите «Свойства отчета», затем выберите «Код» и введите следующее.

Dim CurrentSubtractor AS Integer
Dim CurrentDivisor AS Integer

Public Function GetPrevValueForSubtraction(NewSubtractor AS Integer) AS Integer
    Dim ReturnValue AS Integer = NewSubtractor 

    if CurrentSubtractor = 0 then
        CurrentSubtractor = NewSubtractor 
    else
        ReturnValue = CurrentSubtractor 
        CurrentSubtractor = 0
    end if

    return ReturnValue
end function

Public Function GetPrevValueForDivisor(NewDivisor AS Integer) AS Integer
    Dim ReturnValue AS Integer = NewDivisor 

    if CurrentDivisor = 0 then
        CurrentDivisor = NewDivisor 
    else
        ReturnValue = CurrentDivisor 
        CurrentDivisor = 0
    end if

    return ReturnValue
end function

На данный момент не обращайте внимания на тот факт, что одна и та же функция используется дважды — мы вернемся к этому позже. Код фактически сохраняет новое значение, переданное ему как текущее, или сбрасывает текущее значение до нуля. По мере рендеринга отчета он обрабатывает каждую ячейку по одной и запускает код для каждой ячейки по очереди, поэтому эффективно, если бы у вас был только результат этого кода в ячейке, он вернул бы

0, value, 0, value, 0 value…

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

For every alternative column
    Take the Sum of this column
    Minus the previous column value
    And divide the result by the previous column value

Обратите внимание, что нам нужно дважды использовать значение предыдущего столбца. Если бы мы использовали один и тот же фрагмент кода для обоих, он оценивал бы его дважды для каждой ячейки, сбрасывая значение до нуля в один из раз, когда нам нужно было запустить его. Следовательно, требование для двух функций выше

Установите код для вашего процента по сравнению с 2014 годом в ячейку

=iif(Fields!Year.Value = MAX(Fields!Year.Value, "DataSet10"),
    (sum(Fields!Val.Value) - 
        Code.GetPrevValueForSubtraction(sum(Fields!Val.Value))) / 
        Code.GetPrevValueForDivisor(sum(Fields!Val.Value)),
    "")

В результате получится такая матрица

введите здесь описание изображения

И при запуске это будет выглядеть так

введите здесь описание изображения

Надеюсь, это то, что вам нужно. Если нет, или если вам нужна дополнительная помощь, пожалуйста, дайте мне знать, и я постараюсь помочь дальше.

person Jonnus    schedule 12.11.2015
comment
Большое спасибо Йонус. Это сработало для меня. Ценю ваше время и усилия, чтобы дать этот ответ, это было действительно полезно, так как я изо всех сил пытался получить ответ на то же самое с прошлой недели. - person Sandeep T; 13.11.2015