如何根据 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 函数中,以按字母顺序选择,但我猜这由你决定。
我只需要根据 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 函数中,以按字母顺序选择,但我猜这由你决定。