报表生成器3.0中前面行的总计

时间:2014-10-28 19:26:52

标签: sql-server reporting-services reportbuilder3.0 calculated-field

我已经制作了一份销售报告,显示了销售人员,客户,然后显示去年的销售额,今年的销售额,今年的待定销售额,今年&#39失去了销售,然后在最后一列叫做#34;在游戏中#34;。 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。

当我试图把它放到推销员甚至总计的总排中时,我的斗争就来了。我的数据的结构使得每个合约都有多行,因此计算字段显然是逐行计算的。当我在" In Play"中总结客户端的所有内容时,这似乎工作正常。专栏,但不会为总计工作。部分原因是因为我有Iif公式,但我无法找到更好的方法。

我已尝试过各种方法,以销售员和总计来计算总数,结果是#error或错误的结果。

我尝试添加图片,但stackoverflow不会让我。

编辑: 这是我的问题的文本表示,只是我列表中的推销员之一。

     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

Client6 0,1200,0,0,0

Client7 5300,0,0,0,5300

总计43229,18000,4972,0,43229

在InPlay列和总行中,我希望报告显示为43,429,但公式适用于该行的方式总计为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)

1 个答案:

答案 0 :(得分:0)

Jared,我实际上会在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

原始等式中缺少的重要因素是在IIF()语句中的SUM()。在SSRS中,SUM()接受一个集合,并且个人评估该集合中的每个项目。所以在这个例子中,我们传递SUM()一系列IIF()语句,而不是将SUM()语句的返回传递给IIF()语句。