最初のクエリでは、データがないのに月を返すために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
赤い丸で囲まれた部分まではすべて同じです。それはなぜでしょうか?
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
このようにstackoverflowの "リチャーズ"の最終的なものです。あなたは正しいことが分かりません。 SQLサーバでこれを行う簡単な方法があります( 'TOP X'コマンドは1つです)何をする予定ですか? – Hogan
また、決して 'SELECT * ...'を使うべきではありません。決して。今までにないそれをしないでください。フィールドを一覧表示します。これは遅くなり、バグが発生します。それをしないでください。 – Hogan
SSRSではSUM(NetWrittenPremium)DESCによってレコードをフィルタリングする必要があるため、私はこの方法を行ったのです。合計が正しくないためです。その問題のもう一つの話題。いくつかの回避策がありますが、試してみましたが、それは助けになりませんでした。 リチャードは、毎月トップ10を選ぶという方法でクエリを書いています。 – Oleg