1

以什么可能的方式/方法使用 sql 查询来获得这种结果。 在此处输入图像描述

评委对每位参赛者的评分进行排名,对决赛选手进行排序显示最终排名。

这个@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

结果

在此处输入图像描述

我更喜欢 SQL Fiddle 上的一些材料 http://www.sqlfiddle.com/#!6/30d03/2

4

2 回答 2

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

于 2014-09-30T19:06:18.650 回答
1

First CTE 在 Judge 栏目上做 PIVOT

第二个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
于 2014-09-30T18:17:26.800 回答