Итого за предыдущие строки в построителе отчетов 3.0

Я построил отчет о продажах, который показывает продавца, клиента, а затем показывает продажи в прошлом году, продажи в этом году, незавершенные продажи в этом году, упущенные продажи в этом году, а затем столбец в конце под названием «In Play». Формула In Play должна представлять собой прошлогодние продажи - SUM (продажи в этом году, ожидаемые в этом году, потери в этом году). Если результат формулы меньше 0, я хочу, чтобы он отображал 0.

На уровне клиента я могу заставить его работать со следующим: = Iif (SUM (Fields! InPlay.Value) ‹0,0, SUM (Fields! InPlay.Value)). Я создал вычисляемое поле для InPlay со следующим: = Fields! LastSeasonRevenue.Value-Fields! CurrentSeasonContractedRevenue.Value-Fields! CurrentSeasonPendingRevenue.Value-Fields! CurrentSeasonLostBusiness.Value.

Моя борьба возникает, когда я пытаюсь поместить это в итоговую строку для продавца или даже в общую сумму. Мои данные структурированы так, что в них есть несколько строк для каждого контракта, поэтому вычисляемое поле, очевидно, вычисляется построчно. Кажется, что это нормально работает, когда я суммирую все для уровня клиента в столбце «В игре», но не работает для общих сумм. Частично это происходит из-за формулы Iif, которая у меня есть, но я не могу придумать лучшего способа сделать это.

Я пробовал различные методы, чтобы суммировать его по продавцу и общей сумме либо с #error в качестве результата, либо с неправильным результатом.

Я пытался добавить изображение, но stackoverflow не позволяет мне.

РЕДАКТИРОВАТЬ: это текстовое представление моей проблемы, и это всего лишь один из продавцов в моем списке.

     LastYearRev,  ThisYearRev,  Pending,  Lost,  InPlay   

Клиент1 0, 0, 4972, 0, 0

Клиент2 0, 16800, 0, 0, 0

Клиент3 4800, 0, 0, 0, 4800

Клиент4 6375, 0, 0, 0, 6375

Клиент5 26754, 0, 0, 0, 26754

Клиент6 0, 1200, 0, 0, 0

Client7 5300, 0, 0, 0, 5300

Итого 43229, 18000, 4972, 0, 43229

В столбце InPlay и итоговой строке я хочу, чтобы отчет отображал 43 229, но, как формула будет работать для этой строки, итоговая сумма будет 20 257.

Это должно дать вам данные, с которыми я работаю: CREATE TABLE #SampleData ([Salesman] Varchar(255), Season varchar(255), Company varchar(255), Client varchar(255), ContractNo int, LastSeasonRevenue Decimal, CurrentSeasonNewContractedRevenue Decimal, CurrentSeasonContractedRevenue Decimal, CurrentSeasonPendingRevenue Decimal, CurrentSeasonLostBusiness Decimal, BusinessClosedLastWeek Decimal) ; INSERT INTO #SampleData (Salesman,Season,Company,Client,ContractNO,LastSeasonRevenue,CurrentSeasonNewContractedRevenue,CurrentSeasonContractedRevenue,CurrentSeasonPendingRevenue,CurrentSeasonLostBusiness,BusinessClosedLastWeek) Values('Salesman1','2014-2015','Company5','Client6',1157,0,1200,1200,0,0,0), ('Salesman1','2014-2015','Company1','Client1',1267,0,0,0,4972,0,0), ('Salesman1','2013-2014','Company4','Client7',298,1600,0,0,0,0,0), ('Salesman1','2013-2014','Company4','Client7',298,3400,0,0,0,0,0), ('Salesman1','2013-2014','Company4','Client7',298,300,0,0,0,0,0), ('Salesman1','2013-2014','Company2','Client5',442,4653.75,0,0,0,0,0), ('Salesman1','2013-2014','Company9','Client3',491,4800,0,0,0,0,0), ('Salesman1','2013-2014','Company1','Client4',519,2975,0,0,0,0,0), ('Salesman1','2013-2014','Company1','Client4',519,680,0,0,0,0,0), ('Salesman1','2013-2014','Company1','Client5',674,22100,0,0,0,0,0), ('Salesman1','2013-2014','Company1','Client4',676,2720,0,0,0,0,0), ('Salesman1','2014-2015','Company1','Client2',868,0,16800,16800,0,0,0)


person Jared    schedule 28.10.2014    source источник
comment
Можете ли вы отредактировать свой пост, включив в него текстовое представление таблицы и ваших результатов? Я думаю, что понимаю вопрос, но хочу убедиться, что понимаю. Кроме того, если бы вы могли предоставить набор данных и образцы данных, это тоже было бы полезно. Вначале это звучит как проблема, решаемая лучше в SQL (или многомерных выражениях) в наборе данных, чем в дизайнере отчетов.   -  person Michael    schedule 29.10.2014
comment
@Micheal Я предоставил код для построения данных и текстовую версию своего отчета.   -  person Jared    schedule 31.10.2014


Ответы (1)


Джаред, я бы обработал это в самом наборе данных SQL и добавил вычисляемый столбец под названием «InPlay»:

SELECT Client
, LastSeasonRevenue
, CurrentSeasonContractedRevenue
, CurrentSeasonPendingRevenue
, CurrentSeasonLostBusiness
, CASE WHEN LastSeasonRevenue - CurrentSeasonContractedRevenue
- CurrentSeasonPendingRevenue
- CurrentSeasonLostBusiness <0 THEN  0 ELSE 
LastSeasonRevenue - CurrentSeasonContractedRevenue
- CurrentSeasonPendingRevenue
- CurrentSeasonLostBusiness
END InPlay
FROM #SampleData

Хотя эта логика реализуема в ReportBuilder, рекомендуется отодвинуть этот расчет назад, чтобы на него можно было ссылаться в других частях отчета (также я думаю, что SQL выглядит лучше, чем синтаксис формул SSRS).

Если бы вы хотели сделать это в SSRS (или по какой-то причине, например, используя общий набор данных), формула была бы такой:

=Sum(iif(Fields!LastSeasonRevenue.Value - Fields!CurrentSeasonContractedRevenue.Value - Fields!CurrentSeasonPendingRevenue.Value - Fields!CurrentSeasonLostBusiness.Value< 0 , 0, CDBL(Fields!LastSeasonRevenue.Value) - CDBL(Fields!CurrentSeasonContractedRevenue.Value) - CDBL(Fields!CurrentSeasonPendingRevenue.Value) - CDBL(Fields!CurrentSeasonLostBusiness.Value)))

Снимок экрана приложения: введите описание изображения здесь

Важным фактором, отсутствующим в исходном уравнении, является то, что вы SUM () внутри оператора IIF (). В SSRS SUM () принимает коллекцию, и отдельный пользователь оценивает каждый элемент в этой коллекции. Итак, в этом примере мы передаем SUM () серию операторов IIF () вместо передачи возврата оператора SUM () в оператор IIF ().

person Michael    schedule 31.10.2014
comment
спасибо за ответ, но ваше решение SSRS не работает. Как указано в моем исходном сообщении, как только я доберусь до итоговой строки, указанная вами формула перестанет работать. Однако я попробую использовать SQL-маршрут, но я работаю с общим набором данных, и данные определенно более сложны, чем мой простой ответ, и поэтому я не уверен, что это будет работать так же. - person Jared; 03.11.2014
comment
Джаред, я приложил скриншот работы моего метода. Убедитесь, что ваша функция SUM () включает в себя вашу функцию IIF () в вашем операторе (а не наоборот). SUM () работает с коллекцией элементов и оценивает инструкцию IIF () для каждого элемента в коллекции. - person Michael; 03.11.2014