2015-10-16 3 views
0

Это мой кодКак получить номера строк позиции результата таблицы

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

Похоже, вы действительно хотите сделать что-то вроде ниже. Я использую 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