Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes 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 15/04/2011, 11h04   #1
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
Par défaut Update table temporaire

Bonjour

Je dois réussir à trier une table car tous les mails tels ect ... sont dans une colonne. J'ai décider pour cela d'utiliser une table temporaire car enfaite les données vienne de plusieurs tables.
Dans un premier temps j'ai décidé de copier toute les colonnes ou il n'y a pas besoin de modification, je commence par l'ID. L'Update affiche aucune erreur seulement quand je fais le select il n'y a rien dans la table.

merci d'avance

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
begin DROP TABLE #tableTemp end
CREATE TABLE #tableTemp
(
	ID char NOT NULL PRIMARY KEY,
	NOM VARCHAR NULL,
	PRENOM VARCHAR NULL,
	TEL_FIXE int NULL,
	TEL_PORTABLE int NULL,
	TEL_BUREAU int NULL,
	MAIL VARCHAR NULL
)
 
UPDATE #tableTemp SET #tableTemp.ID = (select dbo.PERSONNE.ID from PERSONNE)
 
SELECT *
FROM #tableTemp
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 11h09   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Normal vous faites un UPDATE sur une table vide....
Si vous voulez alimenter votre table temporaire passez par un INSERT...

Citation:
Je dois réussir à trier une table car tous les mails tels ect ... sont dans une colonne. J'ai décider pour cela d'utiliser une table temporaire car enfaite les données vienne de plusieurs tables.

C'est une très mauvaise approche!!!
Si vos données proviennent de plusieurs table inutile d'utiliser une table temporaire et de multiple insertions... une simple requête avec jointure suffira...


Pouvez vous nous donner un exemple pour récupérer le mail de la personne?
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 11h54   #3
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
Merci ça marche mieux.

Donc enfaite il y a deux tables dans la table PERSONNE il y a ID,NOM,PRENOM,ect... et l'autre INFOSUP_PERSONNE il y a ID,ID_PERSONNE,TYPE,NUM,COMMENTAIRE présenter comme ça

Code :
1
2
3
4
5
6
7
 
TYPE       NUM               COMMENTAIRE       
tel        04.....               bureau
mail      ...@gmail.com  
tel        06...
tel        04...                 prive
tel        04...
pour vérifier le mail cela va car il faut juste vérifier si type='mail'.
sinon pour les téléphones ses plus dur j'avais pensé regarder les commentaires qu'en il y en a.

Donc c'est pour cela que j'avais penser à une table temporaire bien classer avec des case et insert.

Le but étant de transférer dans la table d'une base qui est bien trier en mail, num_fixe,num portable... donc le problème et si la personne a deux numéro comme ci dessous.
tel 04...
tel 04...
comment avec un select et une jointure je peut trier ceci? et lui dire tu place se numéro la et l'autre la.
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 14h15   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Sur le principe, vous pouvez faire par exemple :

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
SELECT 
    Nom, 
    Prenom, 
    Bur.Num AS TelBureau, 
    Priv.Num AS TelPrive, 
    Mail.Num AS Mail
FROM Personne P
LEFT OUTER JOIN INFOSUP_PERSONNE Bur
    ON P.ID = Bur.ID_PERSONNE
    AND Bur.TYPE = 'tel'
    AND Bur.Commentaire = 'bureau'
LEFT OUTER JOIN NFOSUP_PERSONNE Priv
    ON P.ID = Bur.ID_PERSONNE
    AND Bur.TYPE = 'tel'
    AND Bur.Commentaire = 'prive'
LEFT OUTER JOIN NFOSUP_PERSONNE Mail
    ON P.ID = Bur.ID_PERSONNE
    AND Bur.TYPE = 'mail'
ORDER BY Nom, Prenom


Mais :

1/ se baser sur les commentaires ne sera pas forcément si simple, si ces commentaires proviennent de saisies manuel. Vous risquez de trouver 'prive', 'priv.', 'perso'... et il sera difficile de tout identifier automatiquement

2/ que faire quand vous n'avez pas de commentaire (dans la requete si dessus, il ne sont pas pris en compte, mais ça peut se régler simplement) par contre, si en plus il y a plusieurs telephones pour une personne, sans aucun commentaire, que faire ?

3/que faire quand il y a plusieurs mails pour une personne ?


Il vous d'abord définir précisément ce que vous voulez, vérifier tous les cas possibles, ensuite la solution viendra bien plus facilement.


Une question en plus. Pourquoi vouloir peupler une autre table à partir de celles-ci ? est-ce dans un contexte de migration ? comment allez vous exploiter ces données ensuite ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 14h45   #5
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
Citation:
1/ se baser sur les commentaires ne sera pas forcément si simple, si ces commentaires proviennent de saisies manuel. Vous risquez de trouver 'prive', 'priv.', 'perso'... et il sera difficile de tout identifier automatiquement
Je c'est mais pour trier je suis obliger de me basé sur quelque chose. Je ne vois pas vraiment comment je peut faire autrement.

Citation:
que faire quand vous n'avez pas de commentaire (dans la requete si dessus, il ne sont pas pris en compte, mais ça peut se régler simplement) par contre, si en plus il y a plusieurs telephones pour une personne, sans aucun commentaire, que faire ?

Oui c'est justement le cas que j'ai citer plus haut. je pensais mettre le premier dans fixe si il n'y en a pas déjà un, et faire une colonne autre_num.

Citation:
3/que faire quand il y a plusieurs mails pour une personne ?
Je n'est pas vérifier ce cas la.

Citation:
Une question en plus. Pourquoi vouloir peupler une autre table à partir de celles-ci ? est-ce dans un contexte de migration ? comment allez vous exploiter ces données ensuite ?
C'est dans le cadre de la mise en place d'un CRM.

J'ai commencer à faire un code. Mais j'ai un problème il rentre pas tous les nums il en saute.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
begin DROP TABLE #tableTemp end
CREATE TABLE #tableTemp
(
	ID char(7) NOT NULL PRIMARY KEY,
	NOM VARCHAR(100) NULL,
	PRENOM VARCHAR(100) NULL,
	TEL_FIXE VARCHAR(100) NULL,
	TEL_PORTABLE VARCHAR(100) NULL,
	TEL_BUREAU VARCHAR(100) NULL,
	MAIL VARCHAR(100) NULL
)
 
INSERT INTO #tableTemp (#tableTemp.ID,#tableTemp.NOM,#tableTemp.PRENOM)
SELECT dbo.PERSONNE.ID,dbo. PERSONNE.NOM,dbo. PERSONNE.PRENOM
FROM PERSONNE
 
 
UPDATE #tableTemp SET TEL_FIXE=
	CASE 
         WHEN C.TYPE =  'TEL' THEN C.NUMERO 
    END
FROM      #tableTemp S JOIN
          dbo. INFOSUP_PERSONNE C ON  S.ID = C.ID  Collate French_CI_AS
 
 
 
SELECT *
FROM #tableTemp
ORDER BY ID
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 18h08   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

il "saute" des lignes car en fait, il va effectuer l'update avec la première ligne qu'il trouve répondant à la condition de jointure. Si la ligne en question ne répond pas au CASE, alors pas de mise à jour.

Déplacez la du condition du case dans la jointure.

il y a trop de cas par cas pour pouvoir vraiment vous aider sans les données, mais voici une requête qui va ordonner les numéros.
prive -> 1
bureau ->2

cela fonctionne aussi pour les personne pour lesquels tous les commentaires sont a NULL

ca ne fonctionnera pas par contre si des personnes on un commentaire pour bureau mais pas pour prive... ou pour celles ayant plusieurs commentaires pour prive...

Mais ca peut vous donner quelques pistes pour avancer...


Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
SELECT 
	ID_PERSONNE, 
	NUM, 
	ROW_NUMBER() OVER (
		PARTITION BY ID_PERSONNE 
		ORDER BY 
			CASE Commentaire 
				WHEN 'prive' THEN 1 
				WHEN 'bureau' THEN 2 
				ELSE 3 
			END
		) AS RN
FROM INFOSUP_PERSONNE 
WHERE TYPE = 'tel'
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 09h48   #7
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
Bonjour

Citation:
ca ne fonctionnera pas par contre si des personnes on un commentaire pour bureau mais pas pour prive... ou pour celles ayant plusieurs commentaires pour prive...
Oui le problème est tant que, il se peut que la personne est plusieurs numéro privée.

Je ne c'est pas si se que je veux faire est possible mais je voudrai faire quelque chose en TRANSACT SQL comme ceci :

Code :
1
2
3
4
5
6
7
8
9
 
var resultatRequete = SELECT * FROM #tableTemp S JOIN
        dbo. INFOSUP_PERSONNE C ON  S.ID = C.ID  Collate French_CI_AS
 
si resultatRequete.type=='TEL' && resultatRequete.commentaire=='Privee' alor
UPDATE de la personne numéro privée
sinon si resultatRequete.type=='TEL' && resultatRequete.commentaire=='Bureau' alor
UPDATE de la personne numéro bureau
sinon si ....
Et si possible vérifier si la case privée ou bureau n'est pas déjà prise dans ce cas je le passe dans autre numéro.
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 13h16   #8
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Bonjour,

Citation:
Je ne vois pas vraiment comment je peut faire autrement.
...
Je n'est pas vérifier ce cas la.
Waw !

Encore un exemple de requête spaghetti, alors qu'une conception propre aurait vu l'expression de la requête bien moins tordue :

- une table des adresses e-mail, référençant la table client par exemple
- une table des types d'adresse e-mail, référencée par la table des adresses e-mail
- une table des numéros de téléphone, référençant la table client par exemple
- une table des types de numéro de téléphone, référencée par la table des numéros de téléphone

Dans les types d'adresse e-mail ou de numéro de téléphone, on peut tout à fait avoir la valeur du type mise à NULL.
On ajoutera une contrainte d'unicité sur le nom du type.

Il suffit ensuite d'écrire la vue qui convient en effectuant une jointure entre la table client et les autres tables, puis d'interroger la vue.
Et donc bye bye la table temporaire.

Le modèle est très flexible tout en garantissant l'intégrité : on peut ajouter des types d'adresse e-mail ou de numéro de téléphone autant qu'il peut en exister sans avoir quoi que ce soit à changer à la conception

Quel est le tri que vous voulez effectuer ?

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/04/2011, 14h25   #9
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
Citation:
Waw !

Encore un exemple de requête spaghetti, alors qu'une conception propre aurait vu l'expression de la requête bien moins tordue :

- une table des adresses e-mail, référençant la table client par exemple
- une table des types d'adresse e-mail, référencée par la table des adresses e-mail
- une table des numéros de téléphone, référençant la table client par exemple
- une table des types de numéro de téléphone, référencée par la table des numéros de téléphone
Oui mais je suis en stage et comme c'est la base de données de l'entreprise.

Citation:
Dans les types d'adresse e-mail ou de numéro de téléphone, on peut tout à fait avoir la valeur du type mise à NULL.
On ajoutera une contrainte d'unicité sur le nom du type.
Je ne sais pas si j'ai bien compris mais je n'ai pas le droit de modifier la base de données.

Citation:
Il suffit ensuite d'écrire la vue qui convient en effectuant une jointure entre la table client et les autres tables, puis d'interroger la vue.
Et donc bye bye la table temporaire.

Le modèle est très flexible tout en garantissant l'intégrité : on peut ajouter des types d'adresse e-mail ou de numéro de téléphone autant qu'il peut en exister sans avoir quoi que ce soit à changer à la conception
J'avais commencer par utiliser une vue, mon problème est que je n'avais pas réussi à trier si par exemple il avais deux numéro privée ou deux bureau ou un privée un bureau ect... il me renvoyer une erreur comme quoi il exister déjà au moment du deuxième numéro. Je n'arriver pas a séparer les mail des téléphone et les numéro de téléphone entre eux.

Citation:
Quel est le tri que vous voulez effectuer ?
Je voudrais un tri qui me sépare tous les numéros de portable, bureaux, privées, et qui me le range dans des colonnes séparé.
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 14h43   #10
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Citation:
Oui mais je suis en stage et comme c'est la base de données de l'entreprise.
Je comprends ... et je vous plains.

Citation:
Je ne sais pas si j'ai bien compris mais je n'ai pas le droit de modifier la base de données.
Vous avez bien compris, donc ne touchez à rien

Cela dit rien ne nous empêche de suggérer à votre maître de stage le modèle que je vous ai proposé (je ne prends pas de droits d'auteur si vous le faites ), et de mettre cela par exemple dans les évolutions possibles, à la fin de votre mémoire de stage

Code :
Je voudrais un tri qui me sépare tous les numéros de portable, bureaux, privées, et qui me le range dans des colonnes séparé.
D'accord, mais pour cela il vous faut collecter :

- le nombre maximal d'adresses e-mail
- le nombre maximal de numéros de téléphone

Si vous passez en colonne, alors vous perdez le type du numéro de téléphone, et de l'adresse e-mail ...

Citation:
Le but étant de transférer dans la table d'une base qui est bien trier en mail, num_fixe,num portable... donc le problème et si la personne a deux numéro comme ci dessous.
Quelle est la structuration des tables dans la base de données cible ?
Quel numéro devez-vous choisir si la personne a plusieurs numéros ?

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/04/2011, 15h24   #11
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
Citation:
Cela dit rien ne nous empêche de suggérer à votre maître de stage le modèle que je vous ai proposé (je ne prends pas de droits d'auteur si vous le faites ), et de mettre cela par exemple dans les évolutions possibles, à la fin de votre mémoire de stage
Très bonne idée pour le rapport de stage.

Citation:
D'accord, mais pour cela il vous faut collecter :

- le nombre maximal d'adresses e-mail
- le nombre maximal de numéros de téléphone
La je ne comprend pas trop à quoi cela va me servir ?

Citation:
Quelle est la structuration des tables dans la base de données cible ?
C'est la base de donnée du logiciel SugarCRM donc pour l'instant dans ce qui m’intéresse il y a la table contact avec Nom, Prenom, Tel (Fixe, Portable, Bureau...) , Adresse ...

Citation:
Si vous passez en colonne, alors vous perdez le type du numéro de téléphone, et de l'adresse e-mail ...
Ceci n'est pas grave car il seront trier.

Citation:
Quel numéro devez-vous choisir si la personne a plusieurs numéros ?
Tous dépend du commentaire le problème et surtout si la personne à plusieurs numéro sans commentaire. Dans ce cas je pense être obliger de créer d'autres colonnes autre numéro.

J'ai essayais de le faire avec un curseur.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
DECLARE @TYPE char(5), @NUMERO char(100),@COMMENTAIRE char(100)
 
DECLARE CursorVerif CURSOR 
FOR 
   SELECT C.TYPE,C.NUMERO,C.COMMENTAIRE
   FROM  #tableTemp S LEFT OUTER JOIN dbo.INFOSUP_PERSONNE C ON  S.ID = C.ID Collate French_CI_AS  
 
OPEN CursorVerif
 
FETCH CursorVerif INTO @TYPE,@NUMERO,@COMMENTAIRE
 
WHILE @@fetch_Status = 0
 
BEGIN
	IF @TYPE='FAX'
		UPDATE #tableTemp SET FAX=@NUMERO WHERE CURRENT OF CursorVerif
	IF @NUMERO LIKE '6%'
		UPDATE #tableTemp SET TEL_PORTABLE=@NUMERO WHERE CURRENT OF CursorVerif
	IF @TYPE='MAIL'
		UPDATE #tableTemp SET MAIL=@NUMERO WHERE CURRENT OF CursorVerif
	IF @TYPE='TEL' AND @COMMENTAIRE='Bureau'
		UPDATE #tableTemp SET TEL_BUREAU=@NUMERO WHERE CURRENT OF CursorVerif
	IF @TYPE='TEL' AND @COMMENTAIRE='Prive' OR @TYPE='TEL' AND @COMMENTAIRE=''
	Begin
		IF(SELECT * FROM #tableTemp WHERE TEL_FIXE = 'NULL')
         --ICI j'essaye de vérifier si il y a déjà un numéro dans TEL_FIXE
 
	END
 
 
   FETCH CursorVerif INTO @TYPE,@NUMERO,@COMMENTAIRE
END
 
CLOSE CursorVerif
 
 
DEALLOCATE CursorVerif
Il y a encore quelque problème, car quand je compte le nombre de mail de tel, il y en a un peu moin que dans la table de départ.
Après c'est la première méthode que je trouve qui marche un peu prés mais si il y en a d'autre je l'ai veux bien.

@++
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/04/2011, 15h33   #12
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Je vous signale qu'il y a des portable en 07 en France et pour les étrangers (notamment zones frontalières) ceci ne veut rien dire !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 07h10   #13
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Citation:
La je ne comprend pas trop à quoi cela va me servir ?
C'est moi qui ai mal compris, c'est plus précis avec les explications que vous donnez par la suite.

Citation:
C'est la base de donnée du logiciel SugarCRM
Cela ne s'adresse pas à vous directement, mais comme je vois de plus en plus d'horreurs sortir des logiciels de CRM, je me demande si ce n'est pas l'abbréviation de Completely and Rapidly Mediocre ...

Citation:
il y a la table contact avec Nom, Prenom, Tel (Fixe, Portable, Bureau...) , Adresse ...
Peut-on en avoir le script ?
Dans l'explorateur d'objets de SQL Server Management Studio (F8), faites un clic-droit sur la table puis :



Et postez le script (si vous en avez le droit !).

Citation:
Tous dépend du commentaire le problème et surtout si la personne à plusieurs numéro sans commentaire. Dans ce cas je pense être obliger de créer d'autres colonnes autre numéro.
Combien de colonnes ? C'est en fait le but de connaître le nombre maximal de numéros qu'un client peut avoir

Citation:
J'ai essayais de le faire avec un curseur.
Vous pouvez tout à fait éviter le curseur avec un CASE.
Je vous pardonne parce que vous êtes en stage, mais les curseurs, c'est vraiment de la grosse m... (je l'ai démontré ici).
SQL est un langage ensembliste, donc il est conçu pour traiter les données dans leur ensemble, et non pas dans leur unité comme on le fait avec un curseur.
Quand vous codez en SQL, oubliez tout ce que vous avez appris pour coder en fonctionnel (comme en C, C++, C#, Java, ...).

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/04/2011, 09h35   #14
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
Citation:
Je vous signale qu'il y a des portable en 07 en France et pour les étrangers (notamment zones frontalières) ceci ne veut rien dire !

A +
Je me suis renseigner et pas au Luxembourg apparemment.

Citation:
C'est moi qui ai mal compris, c'est plus précis avec les explications que vous donnez par la suite.
Oui désoler c'est dur à expliquer en une fois.

Citation:
Peut-on en avoir le script ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 
USE [sugarcrm_db]
GO
 
/****** Object:  Table [dbo].[contacts]    Script Date: 04/20/2011 09:11:25 ******/
SET ANSI_NULLS OFF
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
SET ANSI_PADDING OFF
GO
 
CREATE TABLE [dbo].[contacts](
	[id] [varchar](36) NOT NULL,
	[date_entered] [datetime] NULL,
	[date_modified] [datetime] NULL,
	[modified_user_id] [varchar](36) NULL,
	[created_by] [varchar](36) NULL,
	[description] [text] NULL,
	[deleted] [bit] NULL,
	[assigned_user_id] [varchar](36) NULL,
	[salutation] [varchar](255) NULL,
	[first_name] [varchar](100) NULL,
	[last_name] [varchar](100) NULL,
	[title] [varchar](100) NULL,
	[department] [varchar](255) NULL,
	[do_not_call] [bit] NULL,
	[phone_home] [varchar](100) NULL,
	[phone_mobile] [varchar](100) NULL,
	[phone_work] [varchar](100) NULL,
	[phone_other] [varchar](100) NULL,
	[phone_fax] [varchar](100) NULL,
	[primary_address_street] [varchar](150) NULL,
	[primary_address_city] [varchar](100) NULL,
	[primary_address_state] [varchar](100) NULL,
	[primary_address_postalcode] [varchar](20) NULL,
	[primary_address_country] [varchar](255) NULL,
	[alt_address_street] [varchar](150) NULL,
	[alt_address_city] [varchar](100) NULL,
	[alt_address_state] [varchar](100) NULL,
	[alt_address_postalcode] [varchar](20) NULL,
	[alt_address_country] [varchar](255) NULL,
	[assistant] [varchar](75) NULL,
	[assistant_phone] [varchar](100) NULL,
	[lead_source] [varchar](255) NULL,
	[reports_to_id] [varchar](36) NULL,
	[birthdate] [datetime] NULL,
	[campaign_id] [varchar](36) NULL,
 CONSTRAINT [pk_contacts] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
 
GO
 
SET ANSI_PADDING OFF
GO
 
ALTER TABLE [dbo].[contacts] ADD  DEFAULT ('0') FOR [deleted]
GO
 
ALTER TABLE [dbo].[contacts] ADD  DEFAULT ('0') FOR [do_not_call]
GO
Citation:
Combien de colonnes ? C'est en fait le but de connaître le nombre maximal de numéros qu'un client peut avoir
Je viens d'apprendre que apparemment il n'y a pas de limite, il rentre autant de numéro qu'il veulent pareil pour le mail.

Citation:
Je vous pardonne parce que vous êtes en stage
Ouf merci

Citation:
mais les curseurs, c'est vraiment de la grosse m... (je l'ai démontré ici).
Oui je m'en suis un peu rendu compte quand mon curseur met plus 1 min pour finir de s’exécuter. Mais j’étais content sa marcher un peu près.

Citation:
Quand vous codez en SQL, oubliez tout ce que vous avez appris pour coder en fonctionnel (comme en C, C++, C#, Java, ...).
Oui c'est exactement ça mon problème.

@++
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 11h49   #15
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Citation:
Oui désoler c'est dur à expliquer en une fois.
Aucun problème

Le script est un parfait exemple de ce qu'il ne faut pas faire, et c'est d'ailleurs presque exactement ce que montre SQLPro dans son étude d'indexation.
Mais bon, visiblement vous n'avez pas le choix, alors on va faire avec

Citation:
Oui c'est exactement ça mon problème.
Pas fastoche, et je crois qu'on est à peu près tous passés par là

Pour en revenir à votre problème : dans votre table source, vous avez une liste de numéros et d'adresses e-mail pour lesquels vous n'avez pas forcément de type, et il est possible que vous ayez plusieurs numéros dans ce cas.
Est-il également possible qu'une personne ait plusieurs numéros de même type ?

Je vous conseillerai d'abord d'extraire les valeurs distinctes des types de numéros et e-mails que vous avez dans la table source.

Code :
1
2
3
4
5
6
7
	SELECT	DISTINCT 'Telephone', COMMENTAIRE
	FROM	maTableSource
	WHERE	TYPE = 'tel'
UNION ALL
	SELECT	 DISTINCT 'EMail', COMMENTAIRE
	FROM	maTableSource
	WHERE	TYPE = 'mail'
Une fois que vous avez cela (c'est la partie pas drôle), il faudrait mettre à jour la colonne COMMENTAIRE (ou rajouter une colonne à la table source) dans laquelle vous unifiez les types de téléphones et de mails.

Par exemple vous pourriez à la suite de la requête précédente obtenir :

Citation:
tel privé
tel PRIVE
tel home
tel maison
tel domicile
tel pro
tel bureau
mail personnel
mail perso
mail pro
mail professionnel
mail Bureau
mail Office
Vous pouvez éventuellement stocker les résultats dans une table intermédiaire de travail, que j'appelle ici unification :

Code :
1
2
3
4
5
6
7
8
	SELECT	DISTINCT 'tel' AS tel_or_mail, COMMENTAIRE AS type_tel_or_mail
	FROM	maTableSource
	INTO unification
	WHERE	TYPE = 'tel'
UNION ALL
	SELECT	 DISTINCT 'mail', COMMENTAIRE
	FROM	maTableSource
	WHERE	TYPE = 'mail'
Ensuite vous pouvez unifier les commentaires dans une colonne supplémentaire :

Code :
1
2
ALTER TABLE unification
ADD new_type_tel_or_mail
Puis effectuer le calcul suivant :

Code :
1
2
3
4
5
6
7
UPDATE	unification
SET	new_type_tel_or_mail = CASE COMMENTAIRE
					WHEN 'privé' THEN 'phone_home'
					WHEN 'PRIVE' THEN 'phone_home'
					WHEN 'pro' THEN 'phone_work'
					...
				END
Avec un peu de chance vous n'avez pas trop de types, et le CASE ne devrait pas être trop long.

Ensuite vous mettez la colonne COMMENTAIRE de la table source à jour :

Code :
1
2
3
4
5
6
UPDATE		dbo.maTableSource
SET		COMMENTAIRE = U.new_type_tel_or_mail
FROM		dbo.maTableSource AS S
INNER JOIN	dbo.unification AS C
			ON S.TYPE = C.tel_or_mail
			AND S.commentaire = C.type_tel_or_mail
Le problème reste entier pour les commentaires vides, pour lesquels vous n'aurez pas d'autre choix que de faire cela à la main (ça c'est la partie pas drôle du tout ...).
Mais vous pouvez peut-être affecter des commentaires en amont, avant de les collecter et de les unifier à l'aide de l'exemple que je vous ai donné.

Une fois cela fait, vous pouvez partir sur une requête comme celle que aieeeuuuuu vous a proposé, et balancer ça dans la table cible.

Qu'en pensez-vous ?

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 09h51   #16
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
Bonjour

Désoler pour le retard.

Citation:
Pour en revenir à votre problème : dans votre table source, vous avez une liste de numéros et d'adresses e-mail pour lesquels vous n'avez pas forcément de type, et il est possible que vous ayez plusieurs numéros dans ce cas.
Est-il également possible qu'une personne ait plusieurs numéros de même type ?
Enfaite je ne sais pas si je comprend bien, mais je voudrais rapeller que j'ai une colonne avec tous dedans, elle s’appelle NUM et dedans j'ai les adresses mail, les numéros de téléphone (portable, privée, bureau ...).
J'ai remis un exemple en dessous, comme on peut voir la même personne peut posséder plusieurs numéro du même type.
Mais aussi il peut y avoir TEL avec un commentaire bureau et le type TELB sans commentaire.
et le mieux c'est quand la personne à plusieurs TEL sans commentaire, c'est l'anarchie total.

Si j'ai forcément un type mais pas forcément de commentaire.
Oui la personne peut avoir plusieurs numéro du même type.

Ma table source :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
ID                TYPE         NUM               COMMENTAIRE   
 
5675             TEL          04.....               bureau
5675             MAIL       ...@gmail.com  
5675             FAX          04...
5676             TEL          04...                 prive
5676             TEL          06...
5677             TELB        04....
5677             GSM         06....
5678             TEL          04...                  prive 
5678             TEL          04...                  prive
5679             TEL          04...                   
5679             TEL          04...  
5679             TEL          06...       
5679             MAIL        ....@hotmail.com

Citation:
Je vous conseillerai d'abord d'extraire les valeurs distinctes des types de numéros et e-mails que vous avez dans la table source.

Code :
1
2
3
4
5
6
7
8
 
SELECT DISTINCT 'Telephone', COMMENTAIRE
	FROM	maTableSource
	WHERE	TYPE = 'tel'
UNION ALL
	SELECT	 DISTINCT 'EMail', COMMENTAIRE
	FROM	maTableSource
	WHERE	TYPE = 'mail'
Je voudrai préciser quelque chose pour copier la table source dans celle du CRM je vais utiliser les packages SSIS à l'aide de visual studio, il me semble que ceci est le plus simple. Mais pour cela il faut que la table source est la même structure car il va prendre la colonne mail de la table source et la copier dans la colonne mail de la table du CRM pareil pour les téléphones
portables, bureaux ... j'ai essayer ceci avec une vue et ça marcher vraiment bien.

Citation:
Une fois que vous avez cela (c'est la partie pas drôle), il faudrait mettre à jour la colonne COMMENTAIRE (ou rajouter une colonne à la table source) dans laquelle vous unifiez les types de téléphones et de mails.

Par exemple vous pourriez à la suite de la requête précédente obtenir :

Citation:
tel privé
tel PRIVE
tel home
tel maison
tel domicile
tel pro
tel bureau
mail personnel
mail perso
mail pro
mail professionnel
mail Bureau
mail Office
Cette idées est bien, mais seulement je peux avoir plusieurs mail pour une personne, mais je n'ai aucun moyen de savoir si c'est un mail pro, privée .. car sur les mails il n'y a aucun commentaire. Je n'ai pas le droit de rajouter de commentaire sur la base de donnée source (celle de l'entreprise). Si j'ai bien compris ce que vous me proposez.

Citation:
Qu'en pensez-vous ?
C'est la m.....
Je ne suis pas sur d'avoir bien compris ce que vous me proposez

Désoler pour le dérangement
Merci pour votre aide

@++
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2011, 14h35   #17
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
Bonjour

Voila ce que je voudrais réussir a faire.
Je voudrai faire une requête qui me permet donc d’ordonnées toutes les données en fonction du type et du commentaire jusque la rien ne change.
Mais je voudrai que si il y a plusieurs tel mail etc.. ceci se mette dans un champ text par exemple description ou je met tous les mails, les tel en trop de façon a ne perdre aucune données.
Mais pour cela je dois vérifier si la case ne contient pas déjà quelque chose.

Il y a t'il moyen avec une requête sql de vérifier si une case n'est pas déjà prise?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
SELECT T.ID,T.NOM,T.PRENOM,CASE C.TYPE
	WHEN 'Mail' THEN 
		UPDATE #tableTemp SET MAIL=NUMERO
	WHEN 'Tel' AND 'Prive' THEN 
		UPDATE #tableTemp SET TEL_FIXE=NUMERO
	WHEN 'Tel' AND 'Bureau' THEN 
		UPDATE #tableTemp SET TEL_BUREAU=NUMERO
	else
		UPDATE #tableTemp SET DESCRIPTION=NUMERO
	END
FROM #tableTemp T JOIN 
INFOSUP_PERSONNE C ON  T.ID = C.ID Collate French_CI_AS
Voila le type de requête qu'il me faudrait même si celle-ci est fausse.
il me faudrait rajouter si la case n'est pas déjà prise.

merci d'avance
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2011, 14h55   #18
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Je n'ai pas vraiment compris, mais ce que vous voulez faire peut s'ecrire comme ca :

Code SQL :
1
2
3
4
5
 
UPDATE TableA
SET UneColonne = COALESCE(UneColonne, TableB.Col1),
UneAutreColonne = COALESCE(UneAutreColonne, TableB.Col2)
FROM TableB
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2011, 15h13   #19
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
Oui mais avec ceci je ne peux pas lui dire que dans tout les autres cas je met dans description.

Je voudrais que si type='Mail' de la table INFOSUP_PERSONNE, il me fait un update sur la case mail de la table #tableTemp de la personne correspondante.
si type='Tel' et commentaire='Prive' il me fait un update dans la table #tableTemp, de la case tel_prive pour la personne correspondante.
ainsi de suite....
et si il rentre pas dans c cas il mette le numéro ou autre dans la case description de la personne.
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2011, 15h35   #20
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Je pense que votre problème n'est pas en SQL , mais plutot que vous ne savez pas vraiment quoi faire de toutes vos données

Vous ne pouvez pas modifier la base source ? ok, rien ne vous empeche d'en importer les données dans une table temporaire de la base cible pour travailler dessus.

Personnellement, comme il s'agit plus d'un problème de migration que de traitement optimisé, je ferai quelque chose comme :

1/ importation des données de la source dans une table de travail de la BDD cible (en gros, le contenu de votre table INFOSUP_PERSONNE)
==> tmpSource(IDPersonne, Type, Num, Commentaire)

2/ creation d'une deuxième table temporaire, identique a la premiere, avec en plus une colonne indiquant le type selon vos critere
==>tmpCible(IDPersonne, Num, TypeOK)

3/ Ensuite, une série de suppression de la table tmpSource, pour les numéros "facile" à classer :

par exemple :
Code SQL :
1
2
3
4
5
6
7
8
9
 
DELETE FROM tmpSource
OUTPUT DELETED.IDPersonne, DELETED.Num, 'prive'
INTO tmpCible
WHERE Type LIKE 'TEL'
AND (
    Commentaire LIKE '%prive%' 
    OR Commentaire LIKE '%perso%'
)

idem pour les autre type de tel, puis pour les mails.

La, il ne vous reste que des infos sans commentaires (ou avec des commentaires ne permettant pas d'identifier le contenu)

Vous pouvez alors vous baser sur une requête (proche de celle que je vous ai déjà donnée) pour répartir les différents numéros restants selon vos critère (le premier en prive, le deuxième en pro,...).

Une fois ceci fait, votre table tmpSource doit être vide, sinon vous avez oublié quelque chose


Enfin, il reste a gérer le cas des personnes ayant plusieurs informations du même type (le je ne sais pas ce que vous voulez faire)

pour terminer, mettre à jour votre table cible finale avec les informations de la table tmpCible, puis supprimer les deux tables temporaires...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h08.


 
 
 
 
Partenaires

Hébergement Web