2016-09-01 5 views
0

最初のクエリでは、データがないのに月を返すためにLEFT JOINを使用しています。しかし、うまくいかないようです。私のクエリはわずかに異なる結果を返します。これはプレミアムのSUMです

2番目のクエリでは、データなしで月を返すためにRIGHT JOIN tblCalendarを使用することに決めました。しかし、なぜ毎月違う結果が出るのですか?次のクエリで

;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' 
            and LineOfCoverage NOT IN ('SSP Commercial General Liability', 'SSP Property') 
    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 
    ) 
    /*And this is that crazy final select statement from Richards (Stackoverflow) */ 
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 

、私がしたすべては、私はSSRSにそれをダンプし、月ごとに分解した後、私は最終的SELECT声明 でRIGHT JOIN tblCalendarを使用最初SELECT声明の中で基本的に代わりtblCalendarのですが、それは違う私を与えます何らかの理由で結果がある

;with cte_TopClasses 
AS ( 
select 
     YEAR(prm.EffectiveDate) as EffectiveYear, --adding Effective because of SSRS repeating column and it gives me a shit 
     MONTH(prm.EffectiveDate) as EffectiveMonthNum, --adding Effective because of SSRS repeating column and it gives me a shit 
     REPLACE(ClassCode,'+','') + ' - '+ QLL.Description as Description, 
     SUM(Premium) as NetWrittenPremium 
--FROM  tblCalendar b 
FROM   ProductionReportMetrics prm 

--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' 
--   AND LineOfCoverage NOT IN ('SSP Commercial General Liability','SSP Property') 
LEFT JOIN NetRate_Quote_Insur_Quote Q ON prm.NetRate_QuoteID = Q.QuoteID 
      AND LineOfCoverage NOT IN ('SSP Commercial General Liability','SSP Property') 
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 YEAR(prm.EffectiveDate) , 
      MONTH(prm.EffectiveDate), 
      ClassCode,  
      QLL.Description 
    ) 
    /*And this is that crazy final select statement from Richards (Stackoverflow) */ 
SELECT Rank, b.YearNum,b.MonthNum, Description,NetWrittenPremium 
    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 RIGHT JOIN tblCalendar b ON b.YearNum = AA.EffectiveYear AND b.MonthNum=AA.EffectiveMonthNum 
      WHERE (b.YearNum = YEAR(GETDATE())-1 and b.MonthNum >= MONTH(GETDATE())+1) OR 
        (b.YearNum = YEAR(GETDATE()) and b.MonthNum <= MONTH(GETDATE())) 

ORDER BY YearNum, MonthNum 

赤い丸で囲まれた部分まではすべて同じです。それはなぜでしょうか?

enter image description here

SQL Serverの中に合計で1位

;with cte_TopClasses 
AS ( 
select 
     YEAR(prm.EffectiveDate) as EffectiveYear, 
     MONTH(prm.EffectiveDate) as EffectiveMonthNum, 
     REPLACE(ClassCode,'+','') + ' - '+ QLL.Description as Description, 
     SUM(Premium) as NetWrittenPremium 

FROM   ProductionReportMetrics prm 

LEFT JOIN NetRate_Quote_Insur_Quote Q ON prm.NetRate_QuoteID = Q.QuoteID 
      AND LineOfCoverage NOT IN ('SSP Commercial General Liability','SSP Property') 
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 
GROUP BY YEAR(prm.EffectiveDate) , 
      MONTH(prm.EffectiveDate), 
      ClassCode,  
      QLL.Description 
    ) 
SELECT TOP 10 Description, SUM(NetWrittenPremium) AS NetWrittenPremium, EffectiveYear,EffectiveMonthNum 
FROM cte_TopClasses RIGHT JOIN tblCalendar b ON b.YearNum = EffectiveYear AND b.MonthNum=EffectiveMonthNum 
      WHERE (b.YearNum = YEAR(GETDATE())-1 and b.MonthNum >= MONTH(GETDATE())+1) OR 
        (b.YearNum = YEAR(GETDATE()) and b.MonthNum <= MONTH(GETDATE())) 
GROUP BY [Description],EffectiveYear,EffectiveMonthNum 
ORDER BY SUM(NetWrittenPremium) DESC 

enter image description here

+0

このようにstackoverflowの "リチャーズ"の最終的なものです。あなたは正しいことが分かりません。 SQLサーバでこれを行う簡単な方法があります( 'TOP X'コマンドは1つです)何をする予定ですか? – Hogan

+0

また、決して 'SELECT * ...'を使うべきではありません。決して。今までにないそれをしないでください。フィールドを一覧表示します。これは遅くなり、バグが発生します。それをしないでください。 – Hogan

+0

SSRSではSUM(NetWrittenPremium)DESCによってレコードをフィルタリングする必要があるため、私はこの方法を行ったのです。合計が正しくないためです。その問題のもう一つの話題。いくつかの回避策がありますが、試してみましたが、それは助けになりませんでした。 リチャードは、毎月トップ10を選ぶという方法でクエリを書いています。 – Oleg

答えて

0

トップ10の記述を試してみてください。

1)は、説明との和を取得:

SELECT [Description], SUM(NetWrittenPremium) AS total 
FROM ct_TopClasses 
GROUP BY [Description] 

2)取るのトップ10

SELECT TOP 10 [Description], SUM(NetWrittenPremium) AS total 
FROM ct_TopClasses 
GROUP BY [Description] 
ORDER BY SUM(NetWrittenPremium) DESC 

これははい、少し簡単ですか?

+0

これはあなたが問題を理解するのに役立つかもしれません。 http://stackoverflow.com/questions/39209657/how -to-pivot-this-query-and-display-only-top-10-records-by-sumnetwritt – Oleg

+0

これは合計列のプレミアムの合計を返します。ちょっと私のポイント、これは機能的に同じです。 – Hogan

+0

私はちょうどあなたのやり方をしました、クエリとその結果は – Oleg

関連する問題