Sql 如何按分组列排列/密集排列
使用sql查询以何种可能的方式/方法获得此类结果。 对每位参赛者的分数进行排名,对决赛选手进行排序,显示最终排名 这个@Prince Jea,给出了一个解决方案,但它不是我所期望的实际结果,尽管它是正确的。尽管如此,我仍在寻找所需的输出 SQL查询Sql 如何按分组列排列/密集排列,sql,dense-rank,Sql,Dense Rank,使用sql查询以何种可能的方式/方法获得此类结果。 对每位参赛者的分数进行排名,对决赛选手进行排序,显示最终排名 这个@Prince Jea,给出了一个解决方案,但它不是我所期望的实际结果,尽管它是正确的。尽管如此,我仍在寻找所需的输出 SQL查询 SELECT ContestantID,JudgeID,ScorePoints, RANK() OVER (ORDER BY ScorePoints DESC) AS xRank, DENSE_RANK() OVER (O
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的资料
第一个CTE在裁判栏上做旋转 第二个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
这里有一个动态的pivot查询,可以与任意一组法官一起使用。枢轴代码改编自
您需要一个只查询3名法官的查询,还是该查询需要能够处理动态的法官?动态的法官,先生。但是如果是最好的,我就买了。太好了!这就是我要找的。我接受你的回答。非常感谢你。
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)