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 :

[10g Express Edition] Calculer un pourcentage dans un simple SELECT


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut [10g Express Edition] Calculer un pourcentage dans un simple SELECT
    Salut les jeunes,

    Voilà j'essaie de concevoir une requête SQL mais j'en perds mon latin.

    J'ai une table de liaison (c'est comme ça que j'appelle une liaison 0,n/0,n qui devient une table dans un MCD, mais si vous savez : avec deux champs comme clef primaire qui sont aussi clefs étrangères). Grosso modo ça ressemble à ça :

    Je voudrais pouvoir calculer le pourcentage de satisfaction, pour chaque possibilité ("Très satisfait", "Assez satisfait", "Peu satisfait") pour chaque entreprise. Pour obtenir :
    TF1 - Très satisfait - 2%
    TF1 - Assez satisfait - 32%
    TF1 - Peu satisfait - 66%
    France 2 - Très satisfait - 34%
    France 2 - Assez satisfait - 46%
    France 2 - Peu satisfait - 20%
    Etc...

    Une tentative :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT NOMENTREPRISE, SATISFACTION, COUNT(((SELECT COUNT(DISTINCT (SATISFACTION)) FROM MATABLE) * 100) / (SELECT * FROM MATABLE))
    FROM MATABLE
    GROUP BY NOMENTREPRISE, SATISFACTION
    Et je sens bien que c'est juste n'importe quoi...

    Toute aide sera vivement appréciée.

    Je suis désolé je ne comprends pas pourquoi mon BBCode refuse de marcher...

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Pas de version d'oracle, pas de réponse.
    Mais va voir quand même du côté des fonctions analytiques dans le tuto
    http://lalystar.developpez.com/fonctionsAnalytiques/
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    Oracle 10g Express Edition.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    J'ai modifié votre jeu d'essais mais voici un début de piste testé en 10gR1 :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    DROP TABLE DVP;
     
    CREATE TABLE DVP(
      NC  VARCHAR2(50),
      NE  VARCHAR2(50),
      S   VARCHAR2(50)
    );
     
    INSERT INTO DVP VALUES ('DUPONT',     'TF1',  'PEU SATISFAIT');
    INSERT INTO DVP VALUES ('MARTIN',     'TF1',  'ASSEZ SATISFAIT');
    INSERT INTO DVP VALUES ('LEFEBVRE',   'TF1',  'PEU SATISFAIT');
    INSERT INTO DVP VALUES ('ALAOUI',     'TF1',  'PEU SATISFAIT');
    INSERT INTO DVP VALUES ('CHIRAC',     'TF1',  'ASSEZ SATISFAIT');
     
    INSERT INTO DVP VALUES ('DUGENOUX',   'MTV',  'PEU SATISFAIT');
    INSERT INTO DVP VALUES ('CRONENBERG', 'MTV',  'ASSEZ SATISFAIT');
    INSERT INTO DVP VALUES ('GATES',      'MTV',  'ASSEZ SATISFAIT');
     
    INSERT INTO DVP VALUES ('JOBS',       'EUROSPORT',  'TRÈS SATISFAIT');
    INSERT INTO DVP VALUES ('PAGE',       'EUROSPORT',  'TRÈS SATISFAIT');
    INSERT INTO DVP VALUES ('HUSSEIN',    'EUROSPORT',  'ASSEZ SATISFAIT');
    INSERT INTO DVP VALUES ('GUILLOT',    'EUROSPORT',  'PEU SATISFAIT');
     
     
    SELECT    NE, S, TRUNC( COUNT(S) / ( SELECT COUNT(*) FROM DVP D2 WHERE D1.NE = D2.NE ) , 2 ) * 100 || '%' AS POURCENTAGE
    FROM      DVP D1
    GROUP BY  NE, S;
    Résultat :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    10g SOC5> DROP TABLE DVP;
     
    Table supprimée.
     
    10g SOC5> 
    10g SOC5> CREATE TABLE DVP(
      2    NC  VARCHAR2(50),
      3    NE  VARCHAR2(50),
      4    S   VARCHAR2(50)
      5  );
     
    Table créée.
     
    10g SOC5> 
    10g SOC5> INSERT INTO DVP VALUES ('DUPONT',     'TF1',  'PEU SATISFAIT');
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('MARTIN',     'TF1',  'ASSEZ SATISFAIT');
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('LEFEBVRE',   'TF1',  'PEU SATISFAIT');
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('ALAOUI',     'TF1',  'PEU SATISFAIT');
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('CHIRAC',     'TF1',  'ASSEZ SATISFAIT');
     
    1 ligne créée.
     
    10g SOC5> 
    10g SOC5> INSERT INTO DVP VALUES ('DUGENOUX',   'MTV',  'PEU SATISFAIT');
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('CRONENBERG', 'MTV',  'ASSEZ SATISFAIT');
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('GATES',      'MTV',  'ASSEZ SATISFAIT');
     
    1 ligne créée.
     
    10g SOC5> 
    10g SOC5> INSERT INTO DVP VALUES ('JOBS',       'EUROSPORT',  'TRÈS SATISFAIT');
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('PAGE',       'EUROSPORT',  'TRÈS SATISFAIT');
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('HUSSEIN',    'EUROSPORT',  'ASSEZ SATISFAIT');
     
    1 ligne créée.
     
    10g SOC5> INSERT INTO DVP VALUES ('GUILLOT',    'EUROSPORT',  'PEU SATISFAIT');
     
    1 ligne créée.
     
    10g SOC5> 
    10g SOC5> 
    10g SOC5> SELECT    NE, S, TRUNC( COUNT(S) / ( SELECT COUNT(*) FROM DVP D2 WHERE D1.NE = D2.NE ) , 2
     ) * 100 || '%' AS POURCENTAGE
      2  FROM      DVP D1
      3  GROUP BY  NE, S;
     
    NE                                                 S                                                  POURCENTAGE
    -------------------------------------------------- -------------------------------------------------
    MTV                                                PEU SATISFAIT                                      33%
    MTV                                                ASSEZ SATISFAIT                                    66%
    TF1                                                PEU SATISFAIT                                      60%
    TF1                                                ASSEZ SATISFAIT                                    40%
    EUROSPORT                                          PEU SATISFAIT                                      25%
    EUROSPORT                                          TRÈS SATISFAIT                                     50%
    EUROSPORT                                          ASSEZ SATISFAIT                                    25%
     
    7 ligne(s) sélectionnée(s).
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  5. #5
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    Merci beaucoup. Entretemps je me suis servi de la page pointée par McM, et il s'avère que c'est la fonction Ratio_To_Report dont j'avais besoin. J'arrive quasiment à obtenir le résultat recherché avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT DISTINCT(NOMCONSULTANT) AS CONS, SATISFACTION, ROUND(100 * RATIO_TO_REPORT(COUNT(SATISFACTION)) over (), 0) || '%' AS POURCENTAGE
    FROM CONSULTANT C, MISSION M, EFFECTUER E
    WHERE C.NUMCONSULTANT = M.NUMCONSULTANT
    AND E.NUMMISSION = M.NUMMISSION
    AND SATISFACTION IN (SELECT DISTINCT SATISFACTION FROM EFFECTUER WHERE SATISFACTION IS NOT NULL)
    GROUP BY NOMCONSULTANT, SATISFACTION
    ORDER BY 1, 2;
    Dernier problème : j'obtiens le pourcentage de satisfaction par consultant et par type de satisfaction, mais par rapport à l'ensemble de la table, et non pour chaque consultant. Si quelqu'un pouvait m'indiquer la légère modification à apporter...

    CONS SATISFACTION POURCENTAGE
    Bouchez Assez satisfait 9%
    Bouchez Peu satisfait 3%
    Bouchez Tres satisfait 6%
    Coignard Assez satisfait 6%
    Coignard Peu satisfait 3%
    Etc...

    Alors que je voudrais :
    Bouchez Assez satisfait 50%
    Bouchez Peu satisfait 20%
    Bouchez Tres satisfait 30%
    Etc...

  6. #6
    Membre confirmé
    Avatar de strat0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2003
    Messages : 288
    Points : 598
    Points
    598
    Par défaut
    C'est bon j'ai trouvé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT NOMCONSULTANT AS CONS, SATISFACTION, ROUND(100 * RATIO_TO_REPORT(COUNT(SATISFACTION)) over (PARTITION BY NOMCONSULTANT), 0) || '%' AS POURCENTAGE
    FROM CONSULTANT C, MISSION M, EFFECTUER E
    WHERE C.NUMCONSULTANT = M.NUMCONSULTANT
    AND E.NUMMISSION = M.NUMMISSION
    AND SATISFACTION IN (SELECT DISTINCT SATISFACTION FROM EFFECTUER WHERE SATISFACTION IS NOT NULL)
    GROUP BY NOMCONSULTANT, SATISFACTION
    ORDER BY 1, 2;

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RATIO_TO_REPORT(COUNT(SATISFACTION)) over (PARTITION BY NOMCONSULTANT)
    bien vu !

    ou plus simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RATIO_TO_REPORT(COUNT(*)) over (PARTITION BY NOMCONSULTANT)

  8. #8
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND SATISFACTION IN (SELECT DISTINCT SATISFACTION FROM EFFECTUER WHERE SATISFACTION IS NOT NULL)
    ==>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND SATISFACTION IN (SELECT SATISFACTION FROM EFFECTUER)

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

Discussions similaires

  1. 10g Express Edition Production
    Par SheikYerbouti dans le forum Oracle
    Réponses: 22
    Dernier message: 22/01/2008, 10h22
  2. Réponses: 1
    Dernier message: 20/12/2006, 23h45
  3. Oracle 10g (Express Edition) ...
    Par avaacn dans le forum Oracle
    Réponses: 9
    Dernier message: 04/04/2006, 17h09
  4. Réponses: 1
    Dernier message: 22/03/2006, 08h24
  5. [Instal] 10g express edition
    Par h.sofia dans le forum Oracle
    Réponses: 23
    Dernier message: 02/03/2006, 11h25

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