SQL RANK()计算

时间:2014-06-27 18:30:11

标签: sql sql-server-2005

我有一个插件查询,我目前正在使用的存储过程中使用它。它如下:

insert into tblAgentRank (AgtID, RankType, Rank, TimeFrame, RankValue)
select AgtID, 8, RANK() OVER (order by SUM(ColPrem*ModeValue) DESC) as Rank, 'Y', SUM(ColPrem*ModeValue)
from tblAppsInfo
where CompanyID in (select CompanyID from tblCompanyInfo
    where DeptID = 7)
group by AgtID
order by Rank

这会为每个代理创建一个总计,并将它们与同行进行排名。


我需要创建一个类似的语句来执行以下计算:

  • 如果PolicyTypeID = 4,则计算SUM(ColPrem * ModeValue)* 0.07
  • 否则,计算SUM((ColPrem * ModeValue)+(ExcessPrem * 0.07))
  • 为每个代理商总结这两个陈述,然后对总数进行排名。

我可以很容易地做其中一个,如第一个查询所示。我的心理障碍源于需要根据PolicyTypeID逐案进行。

3 个答案:

答案 0 :(得分:3)

我认为这个select语句会执行您想要的计算:

select AgtID, 8,
       RANK() OVER (order by SUM(case when PolicyTypeID = 4 then ColPrem*ModeValue * 0.07
                                      else  ColPrem*ModeValue + ExcessPrem * 0.07
                                 end) as RANK2,

       SUM(case when PolicyTypeID = 4 then ColPrem*ModeValue * 0.07
                else  ColPrem*ModeValue + ExcessPrem * 0.07
           end)
from tblAppsInfo
where CompanyID in (select CompanyID from tblCompanyInfo where DeptID = 7)
group by AgtID
order by Rank;

答案 1 :(得分:1)

你只需要在总和中使用case语句。

CASE WHEN PolicyTypeID = 4 THEN SUM(ColPrem*ModeValue) * 0.07 
ELSE SUM((ColPrem*ModeValue) + (ExcessPrem * 0.07)) END

答案 2 :(得分:1)

而不是一起做所有事情你可以分而治之:在CTE中创建一个基本陈述并在主查询中使用它

WITH PT AS (
  SELECT AgtID
       , RankType = 8
       , RankValue4 = SUM(CASE WHEN PolicyTypeID = 4 
                               THEN ColPrem*ModeValue 
                               ELSE 0 
                          END) * 0.07
       , RankValue = SUM(CASE WHEN PolicyTypeID = 4 
                              THEN 0 
                              ELSE (ColPrem*ModeValue) + (ExcessPrem * 0.07) 
                         END)
  FROM   tblAppsInfo
  WHERE  CompanyID in (SELECT CompanyID 
                       FROM   tblCompanyInfo
                       WHERE  DeptID = 7)
  GROUP BY AgtID
)
INSERT INTO tblAgentRank (AgtID, RankType, Rank, TimeFrame, RankValue)
SELECT AgtID, RankType
     , RANK() OVER (ORDER BY RankValue4 + RankValue DESC) as Rank
     , 'Y', RankValue4 + RankValue
FROM   PT

如果公式的第一部分:

,我有点不清楚
  

如果PolicyTypeID = 4,则计算SUM(ColPrem * ModeValue)* 0.07

它真的是SUM(ColPrem*ModeValue) * 0.07或它SUM((ColPrem*ModeValue) * 0.07),我实现了前者,将实现更改为第二种形式只需移动CASE内的乘法