如何使用SSRS中的Lookupsets和Custom Code复制Sum(Sum(Fields!VarName.Value))

时间:2015-03-23 18:31:54

标签: ssrs-2012

我对SSRS相当新,但在使用Lookupsets作为输出时遇到了双重求和的问题。我有下表和查询哪些有用

Query for Hours_DataSet
         SELECT        CallbackDate, SUM(TelemarketingHours) AS DailyHours,
            (SELECT        SUM(TelemarketingHours) AS Expr1
             FROM            CallbackTbl) AS HoursPTD
         FROM            CallbackTbl AS CallbackTbl_1
         GROUP BY CallbackDate

矩阵的定义

      |       [CallbackDate]    |    Weekly totals          
________________________________________________________________

Hours |       [Sum(DailyHours]) |  Sum(Sum(DailyHours)) 

输出是这样的:

12/01/2014 | 12/02/2014 | 12/03/2014 | 12/04/2014 | 12/05/2014| Weekly totals|

28.75      | 42         | 42.25      | 40.25      | 37.50     | 190.75

在另一张表中,我需要计算一周中的每小时约会和每小时的总约会数。所以我将主数据集设置为约会数,并使用lookupset和自定义代码进行求和。

对于一个总和来说,一切都很好。我需要重新创建190.75的数字,并将其用作计算本周每小时约会数的分母。

Query for Positive_DataSet:
        SELECT  MainHistory_1.REALDATE, StatusTbl.Status, COUNT                    (MainHistory_1.DBRECID) AS Positives, StatusTbl.Code,
             (SELECT        COUNT(DBRECID) AS Expr1
              FROM            MainHistory
              WHERE        (REALDATE > CONVERT(DATETIME, @StartDate, 102)) AND         (REALDATE < CONVERT(DATETIME, @EndDate, 102))) AS TotalCalls
        FROM            MainHistory AS MainHistory_1 INNER JOIN
                         StatusTbl ON MainHistory_1.STATUS = StatusTbl.Status
        GROUP BY MainHistory_1.REALDATE, StatusTbl.Status, StatusTbl.Code
        HAVING        (StatusTbl.Code = 'P') AND (MainHistory_1.REALDATE > CONVERT(DATETIME, @StartDate, 102)) AND (MainHistory_1.REALDATE < CONVERT(DATETIME, @EndDate, 102))

My Matrix看起来像这样:

[REALDATE]| Weekly Totals

EXPR      | EXPR

其中表达式为

FORMAT(Code.CalcPerHour(Lookupset(FORMAT(Fields!REALDATE.Value,"Long       Date"),FORMAT(Fields!CallbackDate.Value,"Long Date"),Fields!DailyHours.Value,"Hours_DataSet"),SUM(Fields!Positives.Value)),"Fixed")

Sum(Sum(Fields!Positives.Value))/SUM(code.CalcPTD(Lookupset(FORMAT(Fields!REALDATE.Value,"Long Date"),FORMAT(Fields!CallbackDate.Value,"Long Date"),Fields!DailyHours.Value,"Hours_DataSet")))

我的自定义代码是:

PUBLIC SHARED FUNCTION CalcPerHour(Hours AS OBJECT, Totals AS OBJECT) AS DECIMAL
       DIM i AS INTEGER
       DIM PerHour AS DECIMAL
       FOR i=0 TO UBOUND(Hours)
       IF  CINT(Hours(i)) < > 0 THEN
             PerHour = PerHour + (CDEC(Totals)/CDEC(Hours(i)))
       END IF
       Next i
       RETURN PerHour
    END FUNCTION

    PUBLIC SHARED FUNCTION CalcPTD(LookupArray AS Array) AS DECIMAL
          DIM I AS INTEGER
          DIM Total AS DECIMAL
          Total = 0
             FOR i = 0 to UBOUND(LookupArray)
                 Total = Total + CDEC(LookupArray(i))
             NEXT i
          RETURN Total
   END FUNCTION

我的输出是这样的:

12/01/2014 | 12/02/2014 | 12/03/2014 | 12/04/2014 | 12/05/2014 | Weekly totals|

1.63       | 1.79       | 1.75       | 1.59       | 1.41       | .87

与星期几对应的数字是正确的。

我应该获得的总数是

313/190.75 = 1.64

如果我将其分解并只看这样的总和:

sum(Code.CalcPTD(Lookupset(FORMAT(Fields!REALDATE.Value,"Long Date"),FORMAT(Fields!CallbackDate.Value,"Long Date"),Fields!DailyHours.Value,"Hours_DataSet")))

我得到352.50的结果

如果算上这样的项目数:

Count(Code.CalcPTD(Lookupset(FORMAT(Fields!REALDATE.Value,"Long Date"),FORMA(Fields!CallbackDate.Value,"Long Date"),Fields!DailyHours.Value,"Hours_DataSet")))

我得到9的结果

如果我计算出这样的项目数量:

CountDistinct(Code.CalcPTD(Lookupset(FORMAT(Fields!REALDATE.Value,"Long Date"),FORMAT(Fields!CallbackDate.Value,"Long Date"),Fields!DailyHours.Value,"Hours_DataSet")))

我得到了预期的5

我尝试为不同的总和编写代码,但它不会返回单个结果,而是一系列5对应于一周的日期,我必须在单个单元格中显示。

任何帮助将不胜感激。我知道它有点复杂。如果您有任何疑问或需要进一步澄清,请告知我们。

1 个答案:

答案 0 :(得分:0)

所以我自己想出了答案。要获得数据集中变量的总计,可以使用SUM(fields!VarName.Value,“DataSet”)并为您完成。