【发布时间】:2016-09-01 19:43:37
【问题描述】:
在第一个查询中,我使用LEFT JOIN 返回月份,即使其中没有数据。但似乎它不起作用。
所以在第二个查询中,我决定使用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
在下一个查询中,我所做的基本上是在第一个 SELECT 语句中代替 tblCalendar,我在最后一个 SELECT 语句中使用了 RIGHT JOIN tblCalendar
在我将它转储到 SSRS 并按月分解后,由于某种原因它给了我不同的结果
;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
一切都是一样的,直到用红色圈出的部分。为什么会这样?
尝试#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上的“richards”。你知道这没有意义吗?在 sql server 上有更简单的方法(
TOP X命令是其中之一)它应该做什么? -
另外你不应该使用
SELECT * ...。绝不。永远不会。不要这样做。列出字段。这会很慢并导致错误。不要这样做。 -
我这样做的原因是因为在 SSRS 中我必须按 SUM(NetWrittenPremium) DESC 过滤记录。因为总数不正确。它是该问题的另一个主题。并且有一些解决方法,但我尝试过但没有帮助。因此,Richard 以每月仅选择前 10 名的方式编写查询。
-
好的。感谢您提供有关 SELECT * ... 的建议
-
当然,但是如果你想要每个月的前 10 名,你不需要 rank() 和两个查询——用户一个 group by、一个 sum() 和 TOP 10 限定符。摆脱两个级别的子查询。这就像 sql server 比其他平台做得更好的一件事。
标签: sql sql-server tsql join reporting-services