2016-08-29 3 views
0

このクエリでは、PIVOTを月単位でPIVOTする構文と、SUM(NetWrittenPremium )。私は、以下のクエリを使用し、それを旋回するようにSSRSでMATRICSを使用している場合 enter image description hereこのクエリをPIVOTして、SUM(NetWrittenPremium)でフィルタリングされたTOP 10レコードのみを表示する方法DESC

- その後の説明によってグループ分けした後、それだけで私の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 
     --TOP 10 
     RANK() OVER (ORDER BY NetWrittenPremium DESC) AS Rank, * 
FROM cte_TopClasses 
WHERE Description IS NOT NULL 
ORDER BY NetWrittenPremium DESC,YearNum,MonthNum 

結果はそのようになるはずです。

;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

答えて

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

次に、レポート内のマトリックスを使用して結果をピボットします。

+0

ありがとう、ちょうど試しましたが、マトリックスでグループ化した後、結果は2レコードに過ぎません。私は上記のコードと写真を追加しました。 – Oleg

+0

回答が新しい解決策で更新されました。私が働いていたいくつかのテストデータに対する迅速なテスト。試してみる。 –

+0

OMG !!!正確に私が必要なもの。この問題を解決するために多くの時間を費やしました。 ありがとうSOOOOOリチャーズさん。 私はあなたに聞くことができますか?あなたはSQLでどのくらいの時間をコーディングしていますか?私はいつこのような論理を思いつくことができますか? ありがとう – Oleg

関連する問題