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

How to display top 10 based on total amount in SSRS 2012

我只需要根据 Total (SUM(Premium)) 列显示前 10 个 Class。 我转到 ClassCode 属性组 --> 过滤器并通过 SUM(NetWrittenPremium) 设置前 10 名,但它不起作用。

我只需要显示前 10 个,总金额也应该只显示这 10 个。

无法理解如何实现它。

这是我的查询:

;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

我的查询结果:

@艾伦 谢谢。 查询输出如下所示:

如果我在 dense_rank 中的 order by 中添加 ClassCode,则 $142,000 不会出现在查询中。这不好。

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

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

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

它们在过滤器中如下:

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

实际上我刚刚注意到总计行....这不会正确计算总计并且您不能在 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 函数中,以按字母顺序选择,但我猜这由你决定。