如何透视此查询并仅显示 SUM(NetWrittenPremium) DESC 过滤的前 10 条记录

How to PIVOT this query and display only TOP 10 records filtered by SUM(NetWrittenPremium) DESC

在这个查询中,我无法理解什么是按月 PIVOT 它的正确语法,也只显示基于 SUM(NetWrittenPremium) 的前 10 条记录。

;with cte_TopClasses
AS  ( 
select  
        b.YearNum,
        b.MonthNum,
        REPLACE(ClassCode,'+','') + ' - '+ QLL.Description as Description,
        SUM( Premium) as NetWrittenPremium
FROM        tblCalendar b  
LEFT JOIN   ProductionReportMetrics prm ON b.MonthNum=Month(prm.EffectiveDate) AND b.YearNum = YEAR(EffectiveDate)  
AND prm.EffectiveDate >=DateAdd(yy, -1, DATEADD(d, 1, EOMONTH(GETDATE()))) AND prm.EffectiveDate <= EOMONTH(GETDATE())  AND CompanyLine = 'Ironshore Insurance Company' 
LEFT JOIN  NetRate_Quote_Insur_Quote Q ON prm.NetRate_QuoteID = Q.QuoteID
LEFT JOIN NetRate_Quote_Insur_Quote_Locat QL ON Q.QuoteID = QL.QuoteID  

LEFT JOIN   (SELECT * FROM NetRate_Quote_Insur_Quote_Locat_Liabi nqI 
            JOIN ( SELECT LocationID as LocID, MAX(ClassCode) as ClCode 
            FROM NetRate_Quote_Insur_Quote_Locat_Liabi  GROUP BY LocationID ) nqA 
            ON nqA.LocID = nqI.LocationID AND nqA.ClCode = nqI.ClassCode ) QLL 
            ON QLL.LocationID = QL.LocationID 

WHERE ( b.YearNum = YEAR(GETDATE())-1 and b.MonthNum >= MONTH(GETDATE())+1 ) OR 
                    ( b.YearNum = YEAR(GETDATE()) and b.MonthNum <= MONTH(GETDATE()) ) 
GROUP BY b.YearNum,b.MonthNum,ClassCode,        QLL.Description
    )
SELECT 
        --TOP 10
        RANK() OVER (ORDER BY NetWrittenPremium DESC) AS Rank, * 
FROM    cte_TopClasses
WHERE   Description IS NOT NULL
ORDER BY NetWrittenPremium DESC,YearNum,MonthNum

结果应该是这样的:

如果我使用下面的查询,然后在 SSRS 中使用矩阵来透视它 - 然后在按描述分组后它只显示我 2 描述。

    ;with cte_TopClasses
AS  ( 
select  
        b.YearNum,
        b.MonthNum,
        REPLACE(ClassCode,'+','') + ' - '+ QLL.Description as Description,
        SUM( Premium) as NetWrittenPremium
FROM        tblCalendar b  
LEFT JOIN   ProductionReportMetrics prm ON b.MonthNum=Month(prm.EffectiveDate) AND b.YearNum = YEAR(EffectiveDate)  
AND prm.EffectiveDate >=DateAdd(yy, -1, DATEADD(d, 1, EOMONTH(GETDATE()))) AND prm.EffectiveDate <= EOMONTH(GETDATE())  AND CompanyLine = 'Ironshore Insurance Company' 
LEFT JOIN  NetRate_Quote_Insur_Quote Q ON prm.NetRate_QuoteID = Q.QuoteID
LEFT JOIN NetRate_Quote_Insur_Quote_Locat QL ON Q.QuoteID = QL.QuoteID  

LEFT JOIN   (SELECT * FROM NetRate_Quote_Insur_Quote_Locat_Liabi nqI 
            JOIN ( SELECT LocationID as LocID, MAX(ClassCode) as ClCode 
            FROM NetRate_Quote_Insur_Quote_Locat_Liabi  GROUP BY LocationID ) nqA 
            ON nqA.LocID = nqI.LocationID AND nqA.ClCode = nqI.ClassCode ) QLL 
            ON QLL.LocationID = QL.LocationID 

WHERE ( b.YearNum = YEAR(GETDATE())-1 and b.MonthNum >= MONTH(GETDATE())+1 ) OR 
                    ( b.YearNum = YEAR(GETDATE()) and b.MonthNum <= MONTH(GETDATE()) ) 
GROUP BY b.YearNum,b.MonthNum,ClassCode,        QLL.Description
    )
SELECT *
    FROM (SELECT RANK() OVER (ORDER BY NetWrittenPremium DESC) AS Rank, * 
    FROM    cte_TopClasses
    WHERE   Description IS NOT NULL) AA
WHERE AA.Rank <= 10
ORDER BY AA.NetWrittenPremium DESC, AA.YearNum, AA.MonthNum

以及它在 SSRS 矩阵中的结果:

您可以在查询结束时尝试这样的操作,而不是现在的操作:

SELECT *
    FROM (SELECT RANK() OVER (ORDER BY [Description] DESC) AS Rank, * 
    FROM    cte_TopClasses
    WHERE   Description IN (SELECT [Description]
FROM (SELECT RANK() OVER (ORDER BY SUM(NetWrittenPremium) DESC) AS [Rank], [Description], SUM(NetWrittenPremium) AS total
        FROM cte_TopClasses
        WHERE [Description] IS NOT NULL
        GROUP BY [Description]) BB
    WHERE [Rank] <= 10)) AA
ORDER BY YearNum, MonthNum

这会将查询包装在 SELECT 中,并将排名结果过滤到您想要的 10。

然后在报表中使用矩阵来转换结果。