我需要根据Class
Total
列仅显示前10 (SUM(Premium))
。
我去分组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
我的查询结果:
@Alan 谢谢。 查询输出如下:
如果我在order by
的{{1}}中添加ClassCode,那么$ 142,000将不会出现在查询中。哪个不好。
还有其他想法吗?也许我可以使用dense_rank
函数?
答案 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函数中,按字母顺序选择,但是你可以决定我猜错。