0

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

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

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

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

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

EDIT: Это текстовое представление моей проблемы и является одним из продавцов в моем списке.

 LastYearRev, ThisYearRev, Pending, Lost, InPlay 

Client1 0, 0, 4972, 0, 0

Client2 0, 16800, 0, 0, 0

Client3 4800, 0, 0, 0, 4800

Client4 6375, 0, 0, 0, 6375

Client5 26754, 0, 0, 0, 26754

Cli ent6 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)

+0

Можете ли вы отредактировать свое сообщение, чтобы включить текстовое представление таблицы и ваши результаты? Я думаю, что понимаю этот вопрос, но хочу убедиться, что это так. Кроме того, если бы вы могли предоставить данные и образцы данных, это было бы полезно. С самого начала это похоже на проблему, которая лучше решена в SQL (или MDX) в наборе данных, чем в дизайнере отчетов. – Michael

+0

@ Micheal Я предоставил код для создания данных и текстовую версию моего отчета. – Jared

ответ

0

Джаред, я бы на самом деле справиться с этим в самом 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))) 

Скриншот приложения: enter image description here

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

+0

Благодарим вас за ответ, но ваше решение SSRS не работает. Как указано в моем первоначальном сообщении, как только я доберусь до общей строки, указанная вами формула не будет работать. Тем не менее, я попробую попробовать SQL-маршрут, но я работаю с общим набором данных, и данные, безусловно, более сложны, чем мой простой ответ, и поэтому я не уверен, что будет работать одинаково. – Jared

+0

Джаред, я прикрепил скриншот моего метода работы. Убедитесь, что ваша функция SUM() включает вашу функцию IIF() в вашем заявлении (а не наоборот). SUM() работает над набором элементов и будет оценивать инструкцию IIF() для каждого элемента коллекции. – Michael

Смежные вопросы