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

PL/SQL Oracle Discussion :

Affiner une requête SQL


Sujet :

PL/SQL Oracle

Vue hybride

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Par défaut Affiner une requête SQL
    Bonjour, je suis assez novice en PL/SQL puisque j'ai surtout l'habitude de faire du SQL

    J'ai réussi à faire ce que je voulais, mais pour un soucis de performance, j'aimerais faire évoluer ma requête

    Je ne sais pas si cela est possible.

    20060928090404Esc 854 OUI OUI
    20060928090404Esc 854 OUI NON

    Voici un exemple de mon problème
    Ma requête me procure certains doublons de ce genre.

    Le 1er champ : n° releve (dans les tables)
    Le 2nd champ : code (dans les tables)
    Le 3ème champ : menace (fait suite à un decode)
    Le 4ème champ : influence (encore un decode)

    Je voudrais faire en sorte que :

    Si un n° de releve a une influence en OUI et en NON, retenir que la ligne avec le OUI.
    Si un n° de releve a une influence avec uniquement NON, le garder.
    Si un n° de releve a une influence avec uniquement OUI, le garder.

    Je veux que la ligne en cas de doublon n'apparaisse pas dans le résultat.


    J'ai dit que j'ai réussi à avoir le résultat escompté, mais grâce à Excel.
    J'ai créé une macro qui à supprimer les doublons :

    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
     
    Sub Suppression_Doublon()
    '
    ' Suppression_Doublon Macro
    '
     
        Dim i As Integer
        With ActiveSheet
     
        For i = 10000 To 2 Step -1
        'Row To 2 Step -1 si tu as une ligne d'en-tête que tu veux conserver
     
            If (.Cells(i, "A").Value = .Cells(i + 1, "A").Value) And (.Cells(i + 1, "E").Text = "NON") Then Rows(i + 1).Delete
            Next i
     
        End With
    End Sub

    Mais j'aimerais que ces doublons n'apparaissent pas dans le résultat de la requête dès le départ.



    Voici la requête SQL actuelle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT DISTINCT i.cd_releve, v.code_corine, v.LB_VEGETATION
    ,decode((COUNT (DISTINCT m.TYPE_MENACE)),'0','NON','OUI') AS nb_menace_non_oui
    ,decode((UPPER(m.INFLUENCE) || ' ' || UPPER(m.menaces_active)),'NÉGATIF MENACE ACTIVE', 'OUI', 'NON') AS CONDITION
     
    FROM I202_VEGETATION_STATION v, I202 i LEFT JOIN I202_MENACE_STATION m ON i.cd_releve = m.cd_releve
     
    WHERE i.cd_releve = v.cd_releve
     
    GROUP BY i.cd_releve, v.code_corine, v.LB_VEGETATION, decode((UPPER(m.INFLUENCE) || ' ' || UPPER(m.menaces_active)),'NÉGATIF MENACE ACTIVE', 'OUI', 'NON')
    ORDER BY i.cd_releve ASC, CONDITION DESC
    Si ma demande n'est pas clair, j'espère pouvoir mieux vous l'expliquer en répondant aux questions.

    Merci d'avance pour vos réponses.

  2. #2
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Un truc comme ça ?

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT i.cd_releve
         , v.code_corine
         , v.LB_VEGETATION
         , decode((COUNT (DISTINCT m.TYPE_MENACE)),'0','NON','OUI') AS nb_menace_non_oui
         , max(decode((UPPER(m.INFLUENCE) || ' ' || UPPER(m.menaces_active)),'NÉGATIF MENACE ACTIVE', 'OUI', 'NON')) AS CONDITION
    FROM I202_VEGETATION_STATION v
       , I202 i LEFT JOIN I202_MENACE_STATION m ON i.cd_releve = m.cd_releve
    WHERE i.cd_releve = v.cd_releve
    group by i.cd_releve
           , v.code_corine
           , v.LB_VEGETATION
           , decode((COUNT (DISTINCT m.TYPE_MENACE)),'0','NON','OUI')
    ORDER BY i.cd_releve ASC, CONDITION DESC

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Par défaut
    Bonjour, non le MAX ne change rien (peut être parce que ce n'est pas une variable numérique)
    J'y avait bien pensé, mais sans le moindre effet, j'ai toujours mes "doublons"

  4. #4
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Max fonctionne aussi avec les caractères en classant selen l'ordre des codes caractères.

    Normalement ça devrait fonctionner pour le dédoublonnage avec préférence pour le 'OUI' par rapport au 'NON'.

    Le "group by" te garantit l'unicité de tes 3 premières colonnes.

  5. #5
    Membre Expert Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Par défaut
    Je suis d'accord avec ojo77, le max devrait fonctionner.

    Dans ton post tu ne parles pas du v.LB_VEGETATION, est-il bien le même pour chaque doublon aussi ?

    Aussi rien à voir mais :
    decode((COUNT (DISTINCT m.TYPE_MENACE)),'0','NON','OUI'), ne devrais tu pas comparer le COUNT avec 0 et non '0' ? Il se peut qu'Oracle convertisse tout seul mais pourquoi faire complique ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 63
    Par défaut
    Oula mille excuses, j'ai suivi bêtement ce qui était mis sans voir le GROUP BY
    Le champ était toujours dedans.
    Une fois enlevé, oui, c'est devenu unique ^^

    Merci, je ne pensais pas que cela aurait fonctionné.

    Au sujet du count, il est primordial vu que la donnée n'est pas dans la table, mais je compte le nombre de données.

    Désolé pour ce topic du coup, j'ai cherché à faire compliqué pour une chose ultra simple

    Merci encore

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

Discussions similaires

  1. Pb sur une requête SQL (de champ vide)
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2004, 11h12
  2. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  3. Récupurer via une requête SQL la valeur la plus proche
    Par yoda_style dans le forum Langage SQL
    Réponses: 9
    Dernier message: 27/04/2004, 13h52
  4. Résultat d'une requète SQL
    Par camino dans le forum Bases de données
    Réponses: 2
    Dernier message: 21/02/2004, 15h22
  5. A propos d'une requête SQL sur plusieurs tables...
    Par ylebihan dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/09/2003, 16h26

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