Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/02/2011, 16h11   #1
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 61
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 61
Points : 10
Points : 10
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 :
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 :
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.
dark_mouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2011, 16h41   #2
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Support
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
Un truc comme ça ?

Code sql :
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
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/02/2011, 09h01   #3
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 61
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 61
Points : 10
Points : 10
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"
dark_mouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 09h06   #4
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Support
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
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.
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 09h30   #5
Membre émérite
 
Avatar de Drizzt [Drone38]
 
Homme
Inscription : mai 2004
Messages : 739
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 739
Points : 979
Points : 979
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 ?
__________________
Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

(\ _ /)
(='.'=)
Voici Lapinou. Aidez le à conquérir le monde
(")-(") en le reproduisant
Drizzt [Drone38] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 09h53   #6
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 61
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 61
Points : 10
Points : 10
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
dark_mouette est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h02.


 
 
 
 
Partenaires

Hébergement Web