【问题标题】:Why does my query return slightly different result, which is SUM of premium为什么我的查询返回的结果略有不同,即溢价的总和
【发布时间】: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


【解决方案1】:

sql server 中按总和排名前 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

这有点简单,是吗?

【讨论】:

  • 也许这会帮助你理解问题stackoverflow.com/questions/39209657/…
  • 返回总列中保费的总和。有点我的意思,这在功能上是一样的。
  • 我只是按照你的方法,查询结果如上
  • 哇,我确实把这个复杂化了一点(也许很多!)。我一定见过rank,并没有试图用其他方式来做这件事。不要忘记过滤掉描述为NULL的记录。
  • @Oleg -- 你在上面的例子中做了一些不同的事情 -- 你按描述、年、月分组。这不是我做的,我按描述分组。我不确定你想要的结果,所以我不知道这是否是你需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 2017-09-21
  • 2011-11-07
相关资源
最近更新 更多