Récupérer soit un champ dans une table soit un champ dans une autre - SQL/NoSQL - Programmation
Marsh Posté le 20-01-2009 à 20:16:05
Salut,
J'ai un peu de mal à comprendre la structure... La table Agence, elle sert à quoi concrètement (à moins que id soit en fait Id_Contact, ce qui n'a pas l'air d'être le cas vu la structure des autres tables...). Je t'avoue que je n'ai pas pris le temps d'essayer de comprendre la requête de ton "patron" (je me permets des guillemets aussi...)...
Pourrais-tu expliquer un peu plus la relation entre CONTACT, AGENCE et ENTREPRISE ?
Il faudrait ensuite que tu me dise comment tu comptes détecter qu'une personne n'a pas d'email, à savoir : champ vide, valeur Null, champ contenant des données mais pas au format email valide (et dans ce cas les critères (par défaut je ferai ISNULL(Email, '') NOT LIKE '%@%.%'))
Une fois ces premières réponses apportées, je pense qu'on y verra un peu plus clair (en tout cas pour moi...)
Après, par rapport à ton exemple, ça se résume en gros à :
Si au moins un client lié à une entreprise (par le moyen que tu vas me donner en répondant aux questions) a un email, on récupère leurs emails et toutes les autres personnes liées à cette entreprise mais n'ayant pas d'email sont éliminées, par contre si personne dans une entreprise ne possède d'email, on affecte à la première personne qui nous tombe sous la main l'email de l'entreprise et on élimine toutes les autres personnes...
Ca me paraît un peu "bizarre" comme façon de gérer une campagne d'emailing, mais techniquement tout est possible... Si j'étais à ta place, j'essaierai quand même de valider clairement la règle de gestion (ne serait-ce que pour la perso de l'email et le nombre de personnes que tu vas éliminer).
Bon courage,
Marsh Posté le 20-01-2009 à 20:54:49
Tibar a écrit : Pourrais-tu expliquer un peu plus la relation entre CONTACT, AGENCE et ENTREPRISE ? |
ben, une entreprise a plusieurs agences, qui ont chacune plusieurs contacts
Par exemple, pour l'entreprise kiloutou, y'a l'agence rue machin, boulevard truc et avenue bidule. Dans l'agence rue machin, y'a les contacts A et B. Dans l'agence boulevard truc, y'a les contacts C et D. Etc.
Tibar a écrit : Il faudrait ensuite que tu me dise comment tu comptes détecter qu'une personne n'a pas d'email, à savoir : champ vide, valeur Null, champ contenant des données mais pas au format email valide (et dans ce cas les critères (par défaut je ferai ISNULL(Email, '') NOT LIKE '%@%.%')) |
Code :
|
Tibar a écrit : Si au moins un client lié à une entreprise (par le moyen que tu vas me donner en répondant aux questions) a un email, on récupère leurs emails et toutes les autres personnes liées à cette entreprise mais n'ayant pas d'email sont éliminées, par contre si personne dans une entreprise ne possède d'email, on affecte à la première personne qui nous tombe sous la main l'email de l'entreprise et on élimine toutes les autres personnes... |
c'est ça
Tibar a écrit : Ca me paraît un peu "bizarre" comme façon de gérer une campagne d'emailing, mais techniquement tout est possible... |
c'est parce que la commerciale s'est plantée et elle a renseigné de temps en temps dans le champ entreprise, et de temps en temps dans le champ contact
Tibar a écrit : Si j'étais à ta place, j'essaierai quand même de valider clairement la règle de gestion (ne serait-ce que pour la perso de l'email et le nombre de personnes que tu vas éliminer). |
La personne de l'email on s'en fout, on n'a que des noms, ce sont des prospects, la plupart du temps on a leur nom mais on ne sait pas ce qu'ils font. On prend la première et basta.
Pour les personnes que "j'élimine", de toute façon on n'a pas leurs mails, donc ça change pas grand-chose
Marsh Posté le 21-01-2009 à 10:39:31
Ok, je ne sais pas si ça va être faisable en une seule requête, si tu fais ça :
SELECT
CONTACT.Nom,
CONTACT.Prenom,
CASE CONTACT.Mail
WHEN Null THEN ENTREPRISE.Mail
WHEN '' THEN ENTREPRISE.Mail
WHEN <Autres critères> THEN ENTREPRISE.Mail
ELSE CONTACT.Mail
END,
ENTREPRISE.RaisonSociale
FROM CONTACT
INNER JOIN AGENCE ON AGENCE.Id = CONTACT.Id_Agence
INNER JOIN ENTREPRISE ON ENTREPRISE.Id = AGENCE.Id_Entreprise
ça te retourne pour chaque contact, soit son email propre si il en a un, soit l'email de l'entreprise à laquelle il est rattaché, mais on l'a autant de fois qu'il y a de contacts, c'est ta règle "au premier contact qu'on trouve" qui risque de poser problème, mais c'est une première piste, après avec un DISTINCT sur l'email dans cette requête, tu peux ne récupérer que les lignes qui ont des emails différents, donc à fortiori une seule fois l'email de l'entreprise et tous les autres emails différents...
Marsh Posté le 21-01-2009 à 13:13:14
Tibar a écrit : Ok, je ne sais pas si ça va être faisable en une seule requête, si tu fais ça : |
non mais merci ça j'avais déjà trouvé tout seul
mais justement, pour les entreprises pour lesquelles il y a un mail mais dont les contacts n'ont pas de mail, ça ressort autant de lignes que de contacts.
et tu peux pas faire de distinct juste sur un champ.
Marsh Posté le 20-01-2009 à 15:48:28
Hello
J'ai un problème un peu compliqué à expliquer
J'ai 3 tables : entreprise, agence, contact.
Je veux faire un emailing à un certain groupe de personnes dans ces tables.
Les tables sont comme ça (en gros) :
entreprise :
- id
- raisonsociale
- mail
- autres infos
agence :
- id
- id_entreprise
- adresse et autres infos
contact :
- id
- id_agence
- nom
- prénom
- mail
- autres infos
Je veux :
- les adresses mail et infos (nom, prénom et autres) des contacts
- la raison sociale (et d'autres infos) de l'entreprise à laquelle ils sont rattachés
et le point important qui pose problème :
- pour les entreprises qui n'ont pas de contact avec un email (ou pour toutes, je m'en fous) : récupérer l'email général de l'entreprise et "l'assigner" au premier contact qui tombe sous la main.
Exemple :
Entreprise Albert & fils (email contact@alberts.com), avec les contacts Albert (albert@alberts.com), Alphonse (pas de mail), et Arnaud (arnaud@alberts.com).
Entreprise Barnabé vous veut du bien (email info@barnabe.com), avec les contacts Barnabé, Bertrand et Brutus, qui n'ont pas de mail.
Il faudrait que ça me ressorte :
id contact | id entreprise | nom | raison sociale | email
1 | 1 | albert | Albert & fils | albert@alberts.com
3 | 1 | arnaud | Albert & fils | arnaud@alberts.com
4 | 2 | barnabé | barnabé vous veut du bien | info@barnabe.com
pas plus, pas moins
Mon patron, toujours adepte de, hum, "solutions" "élégantes" et "qui marchent" (j'insiste sur les guillemets à chaque fois), m'a pondu ça :
Donc pas du tout ce qu'ils nous faudrait, puisque ça nous sort :
- tous les contacts qui ont un mail
- plus toutes les entreprises qui ont un mail, avec des infos bidons pour le contact
et en plus c'est moche
est-ce que vous avez une idée ?
---------------
Android/Manettes/Metroidvania/Zelda/Indés/Retrogaming/VDS jeux