如何PIVOT此查询并仅显示由SUM(NetWrittenPremium)DESC过滤的TOP 10记录

时间:2016-08-29 15:15:29

标签: tsql reporting-services pivot

在这个查询中,我无法理解按月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

结果看起来应该是这样的: enter image description here

如果我使用下面的查询然后在SSRS中使用matrics来PIVOT它 - 那么在按描述分组后它只显示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

enter image description here

它在SSRS matrics中的结果: enter image description here

1 个答案:

答案 0 :(得分:2)

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

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个。

然后在报告中使用矩阵来旋转结果。