如何获取表结果的行位置编号

时间:2015-10-16 16:37:25

标签: tsql select stored-procedures row-number

这是我的代码

Select @pos = Pos, @ptsReputacion = isnull(AA.PtsReputacion,0)
    From
    (Select 
    ROW_NUMBER() OVER (ORDER BY @ptsReputacion DESC) AS Pos
    , USUARIO.CodUsuario
    , PtsReputacion = (Select isnull(sum(Puntos),0) as Puntos
                        From USUARIO_RANKING_INTERES 
                        Where USUARIO_RANKING_INTERES.CodUsuario = @codUsuario) 
    , USUARIO.CantIntentos as Intentos
    , USUARIO.CantAciertos as Aciertos
    , USUARIO.CantFallos as Fallos
    , isnull(USUARIO.PG,0) as PG
    , isnull(USUARIO.PE,0) as PE
    , isnull(USUARIO.PP,0) as PP
    , isnull(USUARIO.TiempoTotal,0) as TiempoTotal
    From USUARIO) AA
    Where AA.CodUsuario = @codUsuario

但它不起作用,因为Pos字段有另一个值。例如,它给出2而不是1。

我想知道如何按变量排序获取行位置编号(因为该字段是子查询)。

1 个答案:

答案 0 :(得分:1)

看起来你真的想做类似下面的事情。我正在使用CTE,因为这样可以更容易阅读。

WITH BaseQuery AS
(
SELECT
    U.CodUsuario
    , PtsReputacion = (Select isnull(sum(Puntos),0) as Puntos
                    From USUARIO_RANKING_INTERES 
                    Where USUARIO_RANKING_INTERES.CodUsuario = U.CodUsuario) 
    , USUARIO.CantIntentos as Intentos
    , USUARIO.CantAciertos as Aciertos
    , USUARIO.CantFallos as Fallos
    , isnull(USUARIO.PG,0) as PG
    , isnull(USUARIO.PE,0) as PE
    , isnull(USUARIO.PP,0) as PP
    , isnull(USUARIO.TiempoTotal,0) as TiempoTotal
FROM USUARIO U
),
RNQuery AS
(
SELECT
    *
    , ROW_NUMBER() OVER (ORDER BY PtsReputacion DESC) AS Pos
FROM
    BaseQuery
)
SELECT 
    @pos = Pos
    , @ptsReputacion = isnull(AA.PtsReputacion,0)
FROM
    RNQuery AS AA
WHERE
    AA.CodUsuario = @codUsuario