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 :

Valeur representative d'une colonne


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 13
    Par défaut Valeur representative d'une colonne
    Bonjour,

    je cherche une requête, sans sous requête, me permettant de trouver le mode dans une mesure de tendance centrale.
    ex : valeurs vr -> A,A,B,B,B,C,D,E,E,E,E,E
    me retourne E qui est la valeur la plus présente.


    Actuellement je fait (de manière simplifié):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT vr
    FROM (SELECT vr
             FROM matable
             GROUP BY vr
             ORDER BY COUNT(*) DESC)
    WHERE ROWNUM=1;
    Le contexte d'utilisation actuel (un peu plus complexe) étant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t1.*
      ,(SELECT vr
        FROM (SELECT vr,code
                 FROM t2
                 GROUP BY vr,code
                 ORDER BY COUNT(*) DESC)
        WHERE ROWNUM=1 AND code=t1.code) AS vr
    FROM t1;
    Si la table t2 est importante les temps de réponses peuvent être dégradés
    et une requête de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT t1.*
      ,(SELECT vr
        FROM (SELECT vr
                 FROM t2
                 WHERE code=t1.code
                 GROUP BY vr
                 ORDER BY COUNT(*) DESC)
        WHERE ROWNUM=1) AS vr
    FROM t1;
    ne retourne pas les bonnes valeurs.
    J'ai déjà remarqué que 2 niveaux de sous-requêtes posaient problème lors de l'utilisation de valeur de la requête principale dans la sous-sous-requête.

    J'ai cherché un peu dans les requêtes analytiques mais je n'ai pas trouvé comment formuler cela correctement.

    Donc si vous avez des idées ou des remarques, je suis preneur.

    Cordialement

    P.S.: Oracle 10g ou plus

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    je cherche une requête, sans sous requête
    Pourtant, les trois requêtes que tu présentes comportent au moins une sous-requête !

    Commençons par compter le nombre de lignes par valeur et créons une vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE VIEW v_vr_nb AS
    SELECT vr,
    	COUNT(*) AS nb
    FROM matable
    GROUP BY vr
    Puis cherchons la ou les vr ayant ce plus grand nombre de lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT vr
    FROM v_vr_nb
    WHERE nb =
    (
    	SELECT MAX(nb)
    	FROM v_vr_nb
    )
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 13
    Par défaut
    tout d'abord merci pour le retour rapide.

    Citation Envoyé par CinePhil Voir le message
    Pourtant, les trois requêtes que tu présentes comportent au moins une sous-requête !
    La seule que je veux sans sous-requête est la première requêtes.

    La deuxième est là pour donner le contexte d'utilisation et la troisième pour indiquer qu'une solution filtrant le nombre de résultat n'est pas fonctionnelle.

    Citation Envoyé par CinePhil Voir le message
    Commençons par compter le nombre de lignes par valeur et créons une vue :

    Puis cherchons la ou les vr ayant ce plus grand nombre de lignes :
    J'aurais pu aussi utiliser un WITH au lieu de créer un vue mais ça ne résouts malheureusement pas ma problématique.

    Pour être plus explicite sur mon besoin, en dehors du fait d'assouvir ma curiosité .

    Le but est de restreindre le nombre de lignes impactés par le GROUP BY.

    Par rapport a mon contexte d'utilisation (2ieme requête), je fait un GROUP BY sur t2 au complet alors que seule une sous partie (à filtrer sur le code) m’intéresse.

    Avec 2 sous requêtes, ce filtre au niveau le plus bas n'est pas fonctionnel sous Oracle et avec la vue ou un WITH je ne filtre pas non plus la requête la plus basse.

    Le seul moyen que je vois est d'arriver a transformer la 1iere requête pour qu'elle soit sans sous-requête.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Le problème de la requête 2 est que c'est une requête corrélée. C'est pour ça que les performances ne doivent pas être terribles.

    Tu peux expliquer le besoin réel en français simple ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 13
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Le problème de la requête 2 est que c'est une requête corrélée. C'est pour ça que les performances ne doivent pas être terribles.

    Tu peux expliquer le besoin réel en français simple ?
    Je vais essayer

    J'ai une table de commandes et une table de lignes de commandes.
    Chaque ligne de commande est typée.

    Je souhaite avoir, pour chaque commande, le type majoritaire des lignes de commandes associées, en plus des informations de la commande elle même.

  6. #6
    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
    C'est une requête de type top N => fonctions analytiques.

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

Discussions similaires

  1. extraire les valeurs différentes d'une colonne
    Par mementox dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 01/12/2007, 16h06
  2. valeur max dans une colonne
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 12/08/2007, 22h09
  3. Réponses: 2
    Dernier message: 01/12/2006, 10h09
  4. Réponses: 13
    Dernier message: 06/07/2006, 11h25
  5. Nombre de valeurs différentes dans une colonne
    Par KrusK dans le forum Langage SQL
    Réponses: 4
    Dernier message: 24/08/2005, 14h18

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