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

SQL Oracle Discussion :

Requête croisée (moyennes dans un tableau)


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut Requête croisée (moyennes dans un tableau)
    Bonjour

    Alors voilà, j'ai un petit soucis pour une requête croisée..
    Je possède une table (maTable), contenant 4 champs :

    maTable
    ------------
    Numéro_téléphone (varchar2(10))
    Profil (varchar2(20))
    Débits (Number(6))
    Latence (Number(2)) (chiffre de 0 à 63)

    Ce que je souhaiterai, c'est obtenir les moyennes des latences ainsi que le nombre de numéros de téléphone en fonction d'un pas de débit (j'entends par là "tous les 1000Ko/s" par exemple), le tout groupé par profil.
    Le tableau final doit donc ressembler à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
               1M    2M    3M    4M     1M    2M     3M     4M
    Profil1   10      8     19     5    34.3  32.1   54.3   24.5
    Profil2    5      6     56    32    6.9   38.6    7.9   21.1
    Profil3   23     65     78     4    54.5  43.2   87.4   98.9
    Idéalement je préfèrerai évidemment avoir dans la case profil1-1M le nombre de numéros et la moyenne des latences, tout ça dans la même case, mais je ne suis pas sûr que ça soit faisable! Voilà pourquoi mon idée était de sortir les colonnes comprenant le nombre de numéros en fonction des profils, et les latences ensuite (donc comme le tableau que je vous ai montré).

    Mon soucis se trouve au niveau des moyennes! Je n'arrive pas à calculer les moyennes de mes latences..

    Voilà ce que j'ai déjà pour le comptage des numéros (fonctionne bien) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select profil,
    count(CASE WHEN debit>=1000 AND debit<2000 THEN 1) AS 1M,
    count(CASE WHEN debit>=2000 AND debit<3000 THEN 1) AS 2M,
    count(CASE WHEN debit>=3000 AND debit<4000 THEN 1) AS 3M,
    count(CASE WHEN debit>=4000 AND debit<5000 THEN 1) AS 4M
     
    ## ... Moyennes latences... ##
     
    FROM maTable
    GROUP BY profil ORDER BY profil;
    Pour les moyennes j'avais pensé à quelque chose dans ce style, mais ça m'a l'air foireux.. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT profil,
    (CASE latence WHEN debit>=1000 AND debit<2000 THEN avg(latence)) AS 1M,
    etc etc..
    ??? Merci de votre aide (si bien entendu je peux éviter en plus ce "doublage" de colonnes alors j'en serai ravi )

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Count et Avg sont tous les deux des fonctions de groupe. Regardez donc déjà comment vous avez utilisé le Count; essayez ensuite quelque chose de similaire avec le Avg.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Count et Avg sont tous les deux des fonctions de groupe. Regardez donc déjà comment vous avez utilisé le Count; essayez ensuite quelque chose de similaire avec le Avg.
    Je suis d'accord, ça ne doit pas être si différent de ce que j'ai déjà fait, mais ici ce n'est pas un count, donc je n'aurai pas de "THEN 1" dans mes CASE.

    Ce que j'ai fait pour le AVG (en fin de mon premier post) est-il correct? (je ne peux malheureusement pas tester pour le moment... mais si je pouvai juste avoir confirmation que ça peut fonctionner alors ça sera bon )
    Merci beaucoup

    EDIT : J'ai peur que nous nous soyons mal compris Quand je parle des moyennes des latences, je ne parle pas des moyennes de count c'est à dire que je ne peux pas (et ne dois pas) faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    avg(CASE latence WHEN debit>=1000 AND debit<2000 THEN 1) as 1M
    En effet, je parle bien de la moyenne des latences (soit par exemple : (13+62+10)\3 = 28,33, même si je pense que vous aviez compris )

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Attention il manque les END après les CASE qui sont obligatoires, une erreur en retapant la requête je suppose.

    Dans votre case, vous dites : si le débit vaut entre tant et tant, alors je récupère 1. Puis vous comptez le nombre de 1.

    Et si vous cherchiez à récupérer autre chose dont vous avez besoin ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Attention il manque les END après les CASE qui sont obligatoires, une erreur en retapant la requête je suppose.

    Dans votre case, vous dites : si le débit vaut entre tant et tant, alors je récupère 1. Puis vous comptez le nombre de 1.

    Et si vous cherchiez à récupérer autre chose dont vous avez besoin ?
    Hum je vois où vous voulez en venir. Mais si je fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    avg(CASE latence WHEN debit>=1000 AND debit<2000 THEN sum(latence) END) AS 1M
    Ça ne marcherai pas... si ? Car je suppose qu'il faudrait non pas ajouter des 1, mais bel et bien les latences entres-elles (comme vous le dites)... Mais je ne vois pas trop comment faire (le code que je viens de donner ne me paraît pas bon..)
    Merci beaucoup pour votre aide

    EDIT : je viens de penser à quelque chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    avg(count(CASE latence WHEN debit>=1000 AND debit<2000 THEN latence END))
    Cela peut-il fonctionner ? Désolé de ne pas pouvoir tester, mais si je cherche à résoudre ce problème tout de même c'est que je souhaiterai avoir quelques bases pour demain (histoire de gagner du temps) Merci

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Mais pourquoi avg(count()) ?
    Vous le dites vous-même, vous cherchez à calculer une moyenne.

    Ecrivez votre requête sans aucun agrégat, car je pense que vous ne voyez pas la relation entre les données sources, le pivot (les cases) et l'agrégat final.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Mais pourquoi avg(count()) ?
    En fait je dois calculer une moyenne de latence pour tous les débits compris entre X et Y. Donc mon idée était d'ajouter toutes les latences entre-elles lorsque le débit était compris entre X et Y, puis de faire une moyenne là-dessus, pour obtenir ce que je souhaitais..
    Mais bon je suis au boulot, je vais maintenant pouvoir tester ce que ça donne par moi-même

    Merci

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut
    Bon ben je l'ai...
    voici donc la réponse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    avg(CASE latence WHEN debit>=1000 AND debit<2000 THEN latence END) AS M1
    En fait je n'arrivais pas à me dire comment la moyenne pouvait être faite alors que tous les enregistrements ne sont pas encore vérifié (voyez-vous ce que je veux dire?) D'où le "count" ou même le "sum" que je voulais mettre..
    En fait ça fonctionne comme une moyenne normale

    Dernière chose, est-il possible d'obtenir mes deux résultats (moyenne et nombre) dans les mêmes cases du tableau, afin d'éviter le "doublage" de colonnes?
    Quelque chose dans cet esprit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
               1M    2M    3M    4M     
    Profil1   10      8     19     5            
               34.3   32.1 54.3  24.5
     
    Profil2    5      6     56    32             
                6.9   38.6 7.9   21.1
     
    Profil3   23     65     78     4    
               54.5  43.2   87.4  98.9
    ?? Car à part une mise en page "classique" de tableau à une info par case, je ne vois pas comment mélanger ces résultats (bien entendu je peux le faire sous Excel par exemple, mais ça reste une perte de temps )

    En tout cas merci encore

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Bravo pour avoir trouvé la solution.
    Je vous invite toujours à écrire votre requête sans agrégat, je suis certain que ça vous facilitera la compréhension de ce qui se déroule.


    Pour avoir les deux résultats, un union all entre vos requêtes count et avg avec le bon tri et le tour est joué (rajoutez quand même une colonne supplémentaire pour faire la distinction entre les deux requêtes).

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Par défaut
    Merci beaucoup Waldar, c'est parfait
    Je place le sujet en résolu, merci encore

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

Discussions similaires

  1. [XL-2010] Requête Microsoft Query dans un tableau Excel 2010
    Par exinvil dans le forum Excel
    Réponses: 1
    Dernier message: 01/07/2015, 16h01
  2. Moyenne dans un tableau croisé
    Par beaucourt claudine dans le forum Formules
    Réponses: 2
    Dernier message: 12/09/2011, 15h13
  3. Requête croisée dynamique dans un état
    Par skeut dans le forum IHM
    Réponses: 2
    Dernier message: 03/12/2008, 09h03
  4. [ODBC] Afficher une requête croisée dynamique dans une page PHP
    Par resterzen dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/08/2006, 16h24
  5. Condition dans une requête croisée
    Par decour dans le forum Access
    Réponses: 1
    Dernier message: 18/10/2005, 10h31

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