Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Requête sum et ne garder que les 10 résultat les plus grands


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Requête sum et ne garder que les 10 résultat les plus grands
    Bonjour,

    Je souhaites effectuer la sum de 20 colonnes et n'afficher que celle qui ont les 10 plus grande valeur, est-ce possible , pouvez-vous m'aiguiller.

    Merci.

    Cordialement.

  2. #2
    Expert éminent
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ; WITH SR1 AS (
    	SELECT Id, col1, col2, col_A + col_B + col_C + col_D as Total 
    	FROM dbo.MaTable 
    ) , SR2 AS ( 
    	SELECT Id, col1, col2, Total , ROW_NUMBER() OVER(ORDER BY Total DESC ) AS RowID_TotalOrderDesc
    	FROM SR1
    ) 
    SELECT Id, col1, col2, Total , RowID_TotalOrderDesc
    from SR2
    where RowID_TotalOrderDesc >=10

    Quelque chose dans ce goût-là.
    Doit y avoir plus simple mais ça fait la job.
    les règles du forum - mode d'emploi du forum
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    JE NE RÉPONDS PAS aux questions techniques par message privé.

  3. #3
    Expert éminent
    Euh...

    Pourquoi pas un simple TOP 10 avec un order by ?

    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT top 10 Id, col1, col2, col_A + col_B + col_C + col_D as Total 
    FROM dbo.MaTable
    order by total desc
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Expert éminent
    Citation Envoyé par StringBuilder Voir le message
    Pourquoi pas un simple TOP 10 avec un order by ?
    Y me semblait bien aussi qu'il y avait plus simple...
    C'était la fin de journée, tout ça, je suis comme parti tête baissé dans l'usine à gaz on dirait
    les règles du forum - mode d'emploi du forum
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    JE NE RÉPONDS PAS aux questions techniques par message privé.

  5. #5
    Membre à l'essai
    Merci pour votre aide

  6. #6
    Expert éminent
    J'ajoute mon petit grain de sel, car "il me semble" qu'en cas d'ex-aequo les deux solutions ne donnent pas le même résultat.
    Si les 5 premières lignes renvoient la même valeur, faut-il renvoyer 10 lignes, ou 14 ?

    Tatayo.

  7. #7
    Expert éminent
    Citation Envoyé par tatayo Voir le message
    J'ajoute mon petit grain de sel, car "il me semble" qu'en cas d'ex-aequo les deux solutions ne donnent pas le même résultat.
    Si les 5 premières lignes renvoient la même valeur, faut-il renvoyer 10 lignes, ou 14 ?

    Tatayo.
    Hmmmm ROW_NUMBER() donne des nombres différents en cas d'ex aequo dans la clause ORDER BY du moment qu'on n'a pas de partitionnement, non ? (contrairement à RANK() et DENSE_RANK())
    C'est d'ailleurs pour cette raison que ROW_NUMBER() n'est pas déterministe et que deux exécutions successives de la même requête peuvent donner des résultats différents.
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Expert éminent
    Effectivement, je viens de demander à RTFM, et il n'y a pas de doublons dans la numérotation avec ROW_NUMBER.

    Mais je maintiens quand même ma question (moi têtu ? non, si peu ) Bgrinch veut "les lignes qui ont les 10 plus grandes valeurs", et non les 10 premières lignes. Donc en cas d'ex-aequo, pour moi il faut renvoyer plus de 10 lignes, et donc utiliser la méthode de 7gyY9w1ZY6ySRgPeaefZ mais avec un DENSE_RANK.

    Tatayo.

  9. #9
    Membre expérimenté
    Bonsoir,
    Il me semble que TOP 10 WITH TIES renverra 14 lignes ...
    Le savoir est une nourriture qui exige des efforts.

  10. #10
    Rédacteur

    Citation Envoyé par StringBuilder Voir le message
    Hmmmm ROW_NUMBER() donne des nombres différents en cas d'ex aequo
    Non ! ROW_NUMBER est toujours continu et monotone contrairement à RANK : DENSE_RANK

    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  11. #11
    Expert éminent
    Citation Envoyé par SQLpro Voir le message
    Non ! ROW_NUMBER est toujours continu et monotone contrairement à RANK : DENSE_RANK

    A +
    Ben c'est exactement ce que j'ai dit...
    On ne jouit bien que de ce qu’on partage.