2014-09-30 29 views
1

用什么可能的方式/方法使用sql查询来获得这种结果。 enter image description here如何通过分组列来排名/ dense_rank

排名评委分数给每个参赛者,排序决赛,显示最终排名。

这@Prince Jea,给出了一个解决方案,但它不是我期待的实际结果,虽然它是正确的。仍然,即时寻找所需的输出。

SQL查询

SELECT ContestantID,JudgeID,ScorePoints, 
    RANK() OVER (ORDER BY ScorePoints DESC) AS xRank, 
    DENSE_RANK() OVER (ORDER BY ScorePoints DESC) AS fRank 
FROM 
( 
SELECT ContestantID , ScorePoints, JudgeID 
FROM Score 
) AS a 
ORDER BY 1 

结果

enter image description here

我更喜欢SQL小提琴一些材料 http://www.sqlfiddle.com/#!6/30d03/2

+0

你需要整整3法官查询或没有查询需要能够处理法官的动态#? – FuzzyTree 2014-09-30 18:02:36

+0

一位充满活力的法官先生#。 但如果什么是最好的生病采取它。 – mardagz 2014-09-30 18:04:35

回答

1

首先CTE做PIVOT上菊DGE列

第二CTE是根据法官的分数计算每个选手的排名

三CTE是计算最后得分为每个选手

; WITH CTE 
    AS 
    (
    SELECT ContestantID, 
      MAX(CASE when JudgeID =1 THEN ScorePoints END) as [JudgeID#1], 
      MAX(CASE when JudgeID =2 THEN ScorePoints END) as [JudgeID#2], 
      MAX(CASE when JudgeID =3 THEN ScorePoints END) as [JudgeID#3] 
    FROM Score 
    Group by ContestantID 
    ) 
    , CTE2 AS 
    (
    SELECT ContestantID, 
      [JudgeID#1], 
      RANK() OVER (Order by JudgeID#1 desc) as 'Rank#1',  
      [JudgeID#2], 
      RANK() OVER (Order by JudgeID#2 desc) as 'Rank#2',  
      [JudgeID#3], 
      RANK() OVER (Order by JudgeID#3 desc) as 'Rank#3' 

    FROM CTE 
    ) 
    , CTE3 as 
    (
    SELECT ContestantID, 
      SUM (Rank#1+ Rank#2 + Rank#1) as total 
    FROM CTE2 
    GROUP BY ContestantID 
    ) 
    SELECT CTE2.*, CTE3.total as 'Final Score' 
    FROM CTE2 
    JOIN CTE3 
    ON CTE2.ContestantID = CTE3.ContestantID 
    ORDER BY ContestantID 
+0

优秀!这就是我要找的。我接受你的答案。非常感谢。 – mardagz 2014-09-30 18:23:26

1

这里是一个动态的支点查询与任何#工程的法官。数据透视代码适用于https://stackoverflow.com/a/12505138/3574819

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX), 
    @cols2 AS NVARCHAR(MAX), 
    @cols3 AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ', ' + QUOTENAME(JudgeID) 

        from Score 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


select @cols2 = STUFF((SELECT distinct '+' + QUOTENAME('rn' + CONVERT(varchar(1),JudgeID)) 
        from Score 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

select @cols3 = STUFF((SELECT distinct ', ' + QUOTENAME(JudgeID) + ', rank() over (order by ' + QUOTENAME(JudgeId) + ' desc) ' + QUOTENAME('rn' + CONVERT(varchar(1),JudgeID)) 

        from Score 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT * , 
     rank() over (order by ' + @cols2 + ') rn, 
     (' + @cols2 + ') fn 
     FROM (SELECT ContestantID,' + @cols3 + ' from 
      (
       select ContestantID, ScorePoints, JudgeID 
       from Score 
      ) x 
      pivot 
      (
       max(ScorePoints) 
       for JudgeID in (' + @cols + ') 
      ) p) t1' 

execute(@query) 

http://www.sqlfiddle.com/#!6/87b45/1