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 :

Requete avec moyennes


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 136
    Par défaut Requete avec moyennes
    Bonjour,

    Je souhaiterais réaliser dans la même requête :
    - une moyenne des trois montants les plus élevés
    - une moyenne des trois montants les plus bas
    - une moyenne de tous les montants

    Pouvez vous m'aider pour imbriquer les fonctions type "TOP", "AVG" ...

    Merci par avance.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Utilisez pour ce faire les fonction de fenêtrage : http://sqlpro.developpez.com/article...clause-window/

    Jeun d'essais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE TM (MONTANT FLOAT)
     
    INSERT INTO TM VALUES (123), (456), (789), (101112)
    la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    WITH T AS (
    SELECT MONTANT, 
           RANK() OVER(ORDER BY MONTANT) AS DOWN,
           RANK() OVER(ORDER BY MONTANT DESC) AS UP,
           AVG(MONTANT) OVER() AS MOYENNE
    FROM   TM),
    TD AS (
    SELECT AVG(MONTANT) AS MOY_BASSE
    FROM   T
    WHERE  DOWN >= 3),
    TU AS (
    SELECT AVG(MONTANT) AS MOY_HAUTE
    FROM   T
    WHERE  UP >= 3),
    TT AS (
    SELECT TOP 1 MOYENNE
    FROM   T)
    SELECT MOYENNE, MOY_BASSE, MOY_HAUTE
    FROM   TD CROSS JOIN TU CROSS JOIN TT
    Le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MOYENNE                MOY_BASSE              MOY_HAUTE
    ---------------------- ---------------------- ----------------------
    25620                  50950,5                289,5
    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/ * * * * *

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 136
    Par défaut
    Bonjour et merci pour cette réponse rapide.

    La méthode fonctionne mais les résultats ne sont pas corrects.

    Pour reprendre votre exemple, en moyenne haute vous obtenez 289.5 hors la moyenne de (456), (789), (101112) donne 34119.

    Je vais essayer de regarder en détail.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    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 998
    Billets dans le blog
    6
    Par défaut
    Je suis dyslexique... J'inverse beaucoup de choses, comme la droite, la gauche, les haute et les bas

    Voici la chose rectifiée !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    WITH T AS (
    SELECT MONTANT, 
           RANK() OVER(ORDER BY MONTANT) AS DOWN,
           RANK() OVER(ORDER BY MONTANT DESC) AS UP,
           AVG(MONTANT) OVER() AS MOYENNE
    FROM   TM),
    TD AS (
    SELECT AVG(MONTANT) AS MOY_BASSE
    FROM   T
    WHERE  DOWN <= 3),
    TU AS (
    SELECT AVG(MONTANT) AS MOY_HAUTE
    FROM   T
    WHERE  UP <= 3),
    TT AS (
    SELECT TOP 1 MOYENNE
    FROM   T)
    SELECT MOYENNE, MOY_BASSE, MOY_HAUTE
    FROM   TD CROSS JOIN TU CROSS JOIN TT
    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/ * * * * *

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 136
    Par défaut
    Super, merci beaucoup.

    Est-il possible de ramener la valeur "montant" dans cette requête en complément ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 136
    Par défaut
    Autant pour moi.

    C'est bon j'ai trouvé ce qu'il me fallait.

    Merci pour tout.

    Bonne soirée

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

Discussions similaires

  1. requete avec la valeur NULL
    Par Hinkel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/11/2008, 16h39
  2. requete avec OBCD et visual c++
    Par Anonymous dans le forum MFC
    Réponses: 12
    Dernier message: 18/11/2004, 16h15
  3. Pb d'execution de requete avec un script php
    Par ythierrin dans le forum Requêtes
    Réponses: 3
    Dernier message: 22/08/2003, 14h34
  4. Requete avec une sous-requete... Ne fonctionne qu'a moitie..
    Par mythtvtalk.com dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 18/08/2003, 09h54
  5. Requete avec des décimales
    Par Sandrine75 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 27/06/2003, 10h18

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