Rechercher : dans
Par :

SQL : Exclusion de données

Dernière réponse le 5 mai 2008 à 08:37:02 IMBERNONC, le 24 avr 2008 à 15:14:20 
 Signaler ce message aux modérateurs

Bonjour à tous,

Je suis Responsable du système d'information dans une PME et je dois extraire des données de notre base SQL pour effectuer une analyse. Voici le tableau.

2 tables dans ma base m'intéressent :
la table "client" et la table "reaction". La table client contient les informations du client (adresse, tel, etc...). La table "réaction" contient son activité (commandes, paiements...).

Dans la table "reaction", 2 champs m'intéressent :
le champ "client" qui contient le N° du client
le champ "code" qui contient un code correspondant à une réaction (C=commande, B=paiement...)

Voici un exemple de contenu de cette table :

Client DateReaction Code

16 2007-04-04 00:00:00.000 A
16 2008-03-31 00:00:00.000 C
16 2008-03-31 00:00:00.000 D
25 2007-10-31 00:00:00.000 D
25 2008-01-28 00:00:00.000 A
86 2003-10-08 00:00:00.000 A


Ce que je souhaite c'est ne selectionner que les clients qui ont soit un D, soit un A (ou un D et un A) mais rien d'autre. si un client a un "D, un "A" et autre chose je ne le veux pas !

Si on prend notre exemple ci dessus, la requete devrait me retourner ceci :

25
86

le client 16 ayant un code C, il n'est pas selectionné.


Une fois ce résultat obtenu il faudrait que je puisse le comparer à la table "client" et que je récupère les infos (nom, adresse, numéro de tel...) de tous les clients sélectionnés auparavant. On retrouve le champ "client" contenant le N° du client dans la tables "client".


Voilà donc ma problematique. Je pense qu'il faut procéder par étape et déjà trouver la solution pour la selection de mes clients...

Merci d'avance à tous....

Imbernonc

Configuration: Win 2000 Server
SQL 2000

Meilleures réponses pour « SQL : Exclusion de données » dans :
SQL - Contraintes d'intégrité Voir Expression de contraintes d'intégrité Une contrainte d'intégrité est une clause permettant de contraindre la modification de tables, faite par l'intermédiaire de requêtes d'utilisateurs, afin que les données saisies dans la base soient...
Sauvegarde restauration base de données Mysql VoirL'article suivant va présenter la manière la plus facile pour sauvegarder et restaurer les bases de données Mysql. Sauvegarde Pour sauvegarder une base de données existante il est conseillé de créer un dump. Pour dumper toutes les bases de...
SQL - Modification de table VoirModification de table Il est possible de supprimer une table grâce à la clause DROP, il existe aussi des commandes moins extrêmes permettant L'ajout de colonnes La modification de colonnes La suppression de colonnes Enfin, il est possible...
SQL - Création de table VoirLe SQL, comportant un langage de définition de données (LDD), permet de créer des tables. Pour cela, il utilise le couple de mots clés CREATE TABLE. La création de tables Le création de tables se fait à l'aide du couple de mots-clés CREATE...
Le langage SQL VoirQu'appelle-t-on SQL? SQL (Structured Query Language, traduisez Langage de requêtes structuré) est un langage de définition de données (LDD, ou en anglais DDL Data Definition Language), un langage de manipulation de données (LMD, ou en anglais DML,...

1

Paglop, le 24 avr 2008 à 15:37:56

Il faudrait le nom des tables et des champs

tu peut te renseigné sur internet sur les jointures (pour passer d'une table a une autre: te sert pour retrouver le nom a partir de la refernce client; et les requetes imbriqué (requete a partir d'une requette)

il ya un leger cour sur ccm ici
http://www.commentcamarche.net/sql/sqlintro.php3

sinon pour trouvé la lettre c'est juste un select ... where lettre='A' OR lettre ='D (OR lettre='AD')

Répondre à Paglop

3

IMBERNONC, le 24 avr 2008 à 15:47:47

Merci Paglop pour cette première réponse,
je vais regarder le liens que tu me propose.

Concernant le select lettre='A'... ça ne peut pas me donner le bon resultat, car il va me sortir tous les clients qui ont eu une reaction A, sauf que le client qui a eu un A en 2004 et un F en 2005, je vais le retrouver dans cette liste. Mais moi je ne veux pas ceux qui ont eu autre chose qu'un A ou un D (par exemple)....

Merci encore et A+

imbernonc

Répondre à IMBERNONC

5

Paglop, le 24 avr 2008 à 15:53:20

Tu veut que la derniere ou celle de 2008 ?

Répondre à Paglop

8

IMBERNONC, le 24 avr 2008 à 16:13:09

Non en fait je ne veux obtenir qu'une fois le N° de client (donc distinct) mais seulement des clients ayant eu uniquement comme reaction A ou D (ou A et D) et absolument rien d'autre depuis qu'ils sont clients ( donc de 19xx à 2008)...

A+

Répondre à IMBERNONC

2

Dimitriù, le 24 avr 2008 à 15:44:49

Salut Imbernonc,
je pense que je vais pouvoir t'aider mais je voudrai être sur d'avoir bien compris.
Tu voudrais qu''une seule requête te permette d'avoir les infos sur les clients dont le "code-réaction" est A ou D?
Il te faut leur numéro aussi?

Une dernière chose dans ton exemple à la troisième ligne, le client 16 a un code D... :D).
J'attends ta réponse, à+!

Répondre à Dimitriù

6

IMBERNONC, le 24 avr 2008 à 15:53:29

Salut Dimitriù,

tout d'abord merci de te pencher sur mon problème.

Pour ta question, oui c'est ça il ne me faut que les clients qui on un code A ou D (ou A et D). Si un client a un code A et un code F par exemple je ne le veux pas...

Dan mon exemple effectivement le client 16 a un code D et un code A, mais comme il a aussi un code C, il doit etre exclu ! C'est ce point qui me pose problème....

Merci d'avance,

A+

Imbernonc

Répondre à IMBERNONC

7

Paglop, le 24 avr 2008 à 15:59:39

Sinon tu remplace dans la condition tout les where comme ceux ci

where code<>'b' and code<>'c' and code<>'e' ....

Répondre à Paglop

9

IMBERNONC, le 24 avr 2008 à 16:48:28

Si je remplace par ce que tu me dis,

on retombe sur le même probleme... Il exclu effectivement les lignes ou il y a un F un G....et ne garde que les lignes oou il y a un A ou un D, sauf que du coup si on a ça :

Client code

16 A
16 G
25 A
25 D

Il va me garder mes 2 clients car il va garder les lignes 1, 3 et 4 alors qu'il ne devrait pas garder le client N° 16 (car il n'a pas que du A ou du D...)

Je tourne en rond...

Merci à toi

Répondre à IMBERNONC

10

Paglop, le 24 avr 2008 à 17:11:55
  • +1

Et si tu fait ça :
==>selectionner ceux que tu veut pas
==>prendre les client qui ne figure pas dans ceux que tu veut pas !!!


SELECT distinct CLI_nom, CLI_adr, CLI_tel FROM Client, Reaction
were client<>(SELECT distinct client FROM reaction WHERE CODE='b' Or code='c' CODE='e' Or code='f')

Répondre à Paglop

11

IMBERNONC, le 24 avr 2008 à 17:24:03

Oui c'est ce que je pensais faire.

J'ai une premiere requete qui fonctionne qui me donne les N° de client que je ne veux pas.

Select distinct client from reaction WHERE [reaction].Code ='b' or [reaction].Code='c' or [reaction].Code='G' or [reaction].Code='E' or [reaction].Code='K' or [reaction].Code='F' or [reaction].Code='N' or [reaction].Code='R'

Du coup j'ai fait ça pour ne garder que les autres :

Select distinct client from reaction WHERE client <> (Select distinct client from reaction WHERE [reaction].Code ='b' or [reaction].Code='c' or [reaction].Code='G' or [reaction].Code='E' or [reaction].Code='K' or [reaction].Code='F' or [reaction].Code='N' or [reaction].Code='R')

Mais il mouline et au bout d'un moment j'ai un message d'erreur :

Serveur : Msg 512, Niveau 16, État 1, Ligne 2
La sous-requête a retourné plusieurs valeurs. Cela n'est pas autorisé quand la sous-requête suit =, !=, <, <= , >, >= ou quand elle est utilisée en tant qu'expression.

... Je sens que je ne suis pas tres loin (au moins pour récupérer les N°... la suite on verra plus tard...)

Merci

A+

Répondre à IMBERNONC

12

Paglop, le 24 avr 2008 à 17:30:53

Tu n'aurait pas oublié le point virgule ?

Et sit tu enleve les [ ] ?

Répondre à Paglop

13

IMBERNONC, le 24 avr 2008 à 17:37:12

Oui j'ai zappé tout ce qui est entre []...meme message.

Par contre je ne vois pas où je peux rajouter un ";" ??

Merci de ton aide...

Répondre à IMBERNONC

14

Paglop, le 24 avr 2008 à 17:41:43

Le point virgue est a mettre a chaque fin de requette

Répondre à Paglop

15

Paglop, le 24 avr 2008 à 17:55:09

Je crois me rappellé que le ";" ou "," demend des logiciel : sous acces c'est pas pareil que sous oracle
Dit moi si ca marche

Répondre à Paglop

16

IMBERNONC, le 24 avr 2008 à 17:55:58

Change rien le ; ...

Je risque de pas répondre un petit moment car je rentre à la maison....

Merci encore pour ton aide, je pense que Dimitriù est aussi en train de se creuser la tête (j'espere)...

A+

Répondre à IMBERNONC

17

Paglop, le 24 avr 2008 à 18:02:56

Pour moi l'erreur est dans la deuxiemme ligne de on code

Répondre à Paglop

18

imbernonc, le 24 avr 2008 à 21:24:47

Re !!
tu ferais quoi comme code alors ??

A+

Répondre à imbernonc

4

Paglop, le 24 avr 2008 à 15:51:39
  • +1

Desolé j'avais pas tout lu !!! Les nom des champ ne sont pas geniale a la place de client j'aurai plutot mis CLI_numero

SELECT CLI_nom, CLI_adr, CLI_tel   FROM Client, Reaction
WHERE client=(SELECT distinct client FROM reaction WHERE CODE='a' Or code='D')


ps le distinct sert a n'afficher qu'une seule foix les client

Répondre à Paglop

19

IMBERNONC, le 25 avr 2008 à 11:02:51

Salut à tous,

Alors, j'ai ma requete qui me garde mes bons clients :

Select distinct client from reaction WHERE client not in (Select distinct client from reaction WHERE [reaction].Code ='b' or [reaction].Code='c' or [reaction].Code='G' or [reaction].Code='E' or [reaction].Code='K' or [reaction].Code='F' or [reaction].Code='N' or [reaction].Code='R').

En fait il fallait simplement un " not in" à la plce des " <>"

Merci Paglop pour ton aide

Je savais que j'y étais presque....

Maintenant la deuxieme étape...il faut que je compare cette liste de numero [REACTION].client au numero client de la table client [CLIENT].client....

A suivre....

Répondre à IMBERNONC

20

paglop !!!, le 25 avr 2008 à 13:37:17
  • +2

SELECT client.champ1, client.champ2 , ... from client , reaction 
WHERE client.code=(Select distinct client from reaction WHERE client not in (Select distinct client from reaction WHERE [reaction].Code ='b' or [reaction].Code='c' or [reaction].Code='G' or [reaction].Code='E' or [reaction].Code='K' or [reaction].Code='F' or [reaction].Code='N' or [reaction].Code='R')

Je me souvenait plus du not in pourtant je l'ai deja vu.

Répondre à paglop !!!

21

 imbernonc, le 5 mai 2008 à 08:37:02

Tout fonctionne comme je le souhaite, c'est bon.

Merci pour votre aide et surtout merci à Paglop !!

Imbernonc.

Répondre à imbernonc