如何根据SSRS 2012中的总金额显示前10名

时间:2017-09-06 22:27:38

标签: sql-server tsql reporting-services ssrs-2012

enter image description here

我需要根据Class Total列仅显示前10 (SUM(Premium))。 我去分组ClassCode属性 - >通过SUM(NetWrittenPremium)过滤和设置前10名,但它不起作用。

我只需要显示前10名,而且总金额应仅为10名。

不能理解如何实现它。

enter image description here

enter image description here

这是我的查询:

;WITH cte_TopClasses
AS  ( 
SELECT

        c.YearNum,
        c.MonthNum,
        DD.ClassCode,
        ISNULL(SUM(prm.Premium),0) as NetWrittenPremium 

FROM    tblCalendar c
LEFT JOIN  ProductionReportMetrics prm ON c.YearNum = YEAR(prm.EffectiveDate) and c.MonthNum = MONTH(prm.EffectiveDate) 
           AND CompanyGUID = '18E04C99-D796-4CFA-B1E7-28328321C8AD'      
LEFT JOIN [dbo].[Dynamic_Data_GLUnitedSpecialty] DD on prm.QuoteGUID = DD.QuoteGuid 
WHERE   ( c.YearNum = YEAR(GETDATE())-1 and c.MonthNum >= MONTH(GETDATE())+1 ) OR 
        ( c.YearNum = YEAR(GETDATE()) and c.MonthNum <= MONTH(GETDATE()) ) 
GROUP BY    c.YearNum,
            c.MonthNum,
            DD.ClassCode--,prm.Premium

    )
SELECT   ROW_NUMBER() OVER (PARTITION BY ClassCode ORDER BY NetWrittenPremium DESC),*
FROM cte_TopClasses

我的查询结果:

enter image description here

@Alan 谢谢。 查询输出如下:

enter image description here

如果我在order by的{​​{1}}中添加ClassCode,那么$ 142,000将不会出现在查询中。哪个不好。

还有其他想法吗?也许我可以使用dense_rank函数?

1 个答案:

答案 0 :(得分:1)

在“组属性”中添加排序并设置

Sort by expression "=Sum(NetWrittenPremium)"
Order = "Z to A"

过滤器中的主题如下:

Expression = "=Sum(NetWrittenPremium)"
Operator = Top N
Value = 10

实际上我刚刚注意到Total row .... 这不会正确计算总数,也不能在Tablix上的过滤器中使用聚合(否则会有效)。

最好的办法是将其推回服务器并在那里进行。

我无法直接在您的数据上对此进行测试,但它应该可以正常运行,我测试了类似的...

SELECT r.* FROM 
    (SELECT d.* 
            , dense_rank() OVER(ORDER BY TotalNWP Desc) AS rnk
        FROM 
            (SELECT DISTINCT
                ClassCode, YearNum, MonthNum
                , SUM(t.NetWrittenPremium) OVER (PARTITION BY ClassCode, YearNum, MonthNum) AS NetWrittenPremium
                , SUM(t.NetWrittenPremium) OVER (PARTITION BY ClassCode) AS TotalNWP
             FROM cte_TopClasses t
            ) d
    ) r
    WHERE rnk <=10

现在不需要在SSRS中进行任何过滤,只需按rnk列进行排序。

你唯一剩下的问题是如何确定哪些最后的结果(总数都相同)先于其他结果。你可以做一些事情,比如将classCode添加到dense_rank函数中,按字母顺序选择,但是你可以决定我猜错。