IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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
    Homme Profil pro
    Technicien Methode
    Inscrit en
    Juillet 2018
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien Methode

    Informations forums :
    Inscription : Juillet 2018
    Messages : 32
    Points : 15
    Points
    15
    Par défaut 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
    Invité
    Invité(e)
    Par défaut
    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.

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 400
    Points
    7 400
    Billets dans le blog
    1
    Par défaut
    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
    Invité
    Invité(e)
    Par défaut
    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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Technicien Methode
    Inscrit en
    Juillet 2018
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Technicien Methode

    Informations forums :
    Inscription : Juillet 2018
    Messages : 32
    Points : 15
    Points
    15
    Par défaut
    Merci pour votre aide

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    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
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 400
    Points
    7 400
    Billets dans le blog
    1
    Par défaut
    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 sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    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é
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    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

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    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 +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  11. #11
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 400
    Points
    7 400
    Billets dans le blog
    1
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ne récupérer que les plus grandes dates
    Par david71 dans le forum Requêtes et SQL.
    Réponses: 16
    Dernier message: 28/07/2010, 18h13
  2. Réponses: 2
    Dernier message: 18/03/2009, 07h48
  3. Réponses: 3
    Dernier message: 28/04/2008, 14h57
  4. garder que les doublons ?
    Par deby23 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 14/02/2008, 13h41
  5. Garder que les 10 premiers caractère d'une variable
    Par dembroski dans le forum Langage
    Réponses: 2
    Dernier message: 27/06/2007, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo