0

私はこのクエリを持っています:

select   ROW_NUMBER() OVER ( PARTITION BY codtiers ORDER BY case when isnull(cumulapport, 0) > isnull(cumulretrait, 0) then cumulapport
 else cumulretrait
end DESC ) AS classement,
                    codTiers
           from     dbo.TiersComptesLocal 
           group by codTiers

この結果を返します:

classement  |  codTiers  
-------------------------
    1       |  1XXXXX
    2       |  1XXXXX
    1       |  1YYXXX
    2       |  1YYXXX
    3       |  1YYXXX
    1       |  1XXXYY

次のような結果を得たいすべてのパーティションの最初の行を表示したい:

classement  |  codTiers  
-------------------------
    1       |  1XXXXX
    1       |  1YYXXX
    1       |  1XXXYY

どんなアイデアでも大歓迎です。

これは私の完全なクエリです:

select   ROW_NUMBER() OVER ( PARTITION BY tcl_codtiers ORDER BY case when isnull(cumulapport, 0) > isnull(cumulretrait, 0) then cumulapport
                                                                                                                else cumulretrait
                                                                                                           end DESC ) AS classement,

                                        TCL_CodTiers,
                                        'le montant max des ' + Senscumul + ' ( '
                        + convert(varchar(50), '') + ' € ) du tiers titulaire '
                        + TCL_CodTiers + ' ( ' + ''
                        + ' ) est supérieur au seuil fixé dans l''alerte : '
                        + '75000'

                               from     dbo.CLI_TCL_TiersComptesLocal
                                        INNER JOIN dbo.CLI_GCO_GeneriquesComptes ON TCL_CodTiers = GCO_CodTiersPrincipal
                                                                                    AND TCL_NumLien IN ( 0, 1 )
                                                                    inner join ( select TCL_CodTiers CodTiers,
                                                                sum(case when ESO_MntValoRetenuEnEuros > 0
                                                                         then ESO_MntValoRetenuEnEuros
                                                                         else 0
                                                                    end) cumulapport,
                                                                sum(case when ESO_MntValoRetenuEnEuros < 0
                                                                         then abs(ESO_MntValoRetenuEnEuros)
                                                                         else 0
                                                                    end) cumulretrait, 
                                                                      case when isnull(  sum(case when ESO_MntValoRetenuEnEuros > 0
                                                                         then ESO_MntValoRetenuEnEuros
                                                                         else 0
                                                                    end), 0) > isnull( sum(case when ESO_MntValoRetenuEnEuros < 0
                                                                         then abs(ESO_MntValoRetenuEnEuros)
                                                                         else 0
                                                                    end), 0)
                                                 then 'Apports'
                                                 else 'Retraits'
                                            end as Senscumul
                                                         from   CRO_ESO_EntreeSortie
                                                                inner join CLI_TCL_TiersComptesLocal on TCL_CodCompte = ESO_CodCompte
                                                                                                        and TCL_NumLien in ( 0, 1 )
                                                         group by TCL_CodTiers
                                                         having sum(case when ESO_MntValoRetenuEnEuros > 0
                                                                         then ESO_MntValoRetenuEnEuros
                                                                         else 0
                                                                    end) > 75000
                                                                or sum(case when ESO_MntValoRetenuEnEuros < 0
                                                                            then abs(ESO_MntValoRetenuEnEuros)
                                                                            else 0
                                                                       end) > 75000
                                                       ) surveillance on GCO_CodTiersPrincipal = CodTiers

前もって感謝します。

4

3 に答える 3

2
WITH CTE
AS
(
    SELECT
      ROW_NUMBER() OVER (PARTITION BY codtiers 
                         ORDER BY CASE 
                                    WHEN ISNULL(cumulapport, 0) >
                                         ISNULL(cumulretrait, 0) THEN cumulapport
                                  ELSE cumulretrait
                                  END DESC) AS classement,
                        codTiers
    FROM dbo.TiersComptesLocal 
) 
SELECT * 
FROM CTE
WHERE classement = 1;

アップデート

@AaronBertrandの回答classementのように、代わりにCTEまたはサブクエリを使用する必要があります。ただし、同じクエリでこれを行いたい場合は、なしでこれを行う必要がありますROW_NUMBER()

    SELECT
      codtiers,
      MAX(CASE 
            WHEN ISNULL(cumulapport, 0) >
                 ISNULL(cumulretrait, 0) THEN cumulapport
            ELSE cumulretrait
            END DESC) AS classement
    FROM dbo.TiersComptesLocal 
    GROUP BY codtiers;
于 2013-01-15T14:24:14.077 に答える
2

CTEを使用したくない理由はわかりませんが、必要に応じて派生テーブルを使用できますが、基本的にはMahmoudがすでに投稿したのと同じ答えです:

SELECT *
FROM (SELECT ROW_NUMBER() OVER (PARTITION BY codtiers 
                                ORDER BY CASE WHEN ISNULL(cumulapport, 0)>ISNULL(cumulretrait, 0) 
                                              THEN cumulapport ELSE cumulretrait END DESC) AS classement,
             codTiers
        FROM dbo.TiersComptesLocal 
        GROUP BY codTiers) A
WHERE classement = 1
于 2013-01-15T14:37:01.387 に答える
2

使用しない場合の解決策を次に示しますがWITH、これが問題になる理由はわかりません。

SELECT classement, codtiers
FROM 
(
  SELECT 
    classement = ROW_NUMBER() OVER (PARTITION BY codtiers 
      ORDER BY CASE WHEN ISNULL(cumulapport, 0) > ISNULL(cumulretrait, 0) 
      THEN cumulapport ELSE cumulretrait END DESC),
    codTiers
  FROM dbo.TiersComptesLocal 
) AS x
WHERE classement = 1;
于 2013-01-15T14:39:39.630 に答える