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

Développement SQL Server Discussion :

Update table temporaire


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 220
    Points : 48
    Points
    48
    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 : 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
     
    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

  2. #2
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Normal vous faites un UPDATE sur une table vide....
    Si vous voulez alimenter votre table temporaire passez par un INSERT...

    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.
    MCTS Database Development
    MCTS Database Administration

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 220
    Points : 48
    Points
    48
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Sur le principe, vous pouvez faire par exemple :

    Code SQL : 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
    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 ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 220
    Points : 48
    Points
    48
    Par défaut
    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.

    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.

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

    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 : 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
    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

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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'

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 220
    Points : 48
    Points
    48
    Par défaut
    Bonjour

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    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 ?

    @++

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 220
    Points : 48
    Points
    48
    Par défaut
    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.

    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.

    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.

    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é.

  10. #10
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Oui mais je suis en stage et comme c'est la base de données de l'entreprise.
    Je comprends ... et je vous plains.

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ...

    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 ?

    @++

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 220
    Points : 48
    Points
    48
    Par défaut
    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.

    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 ?

    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 ...

    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.

    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 : 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
    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.

    @++

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 736
    Points : 52 448
    Points
    52 448
    Billets dans le blog
    5
    Par défaut
    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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  13. #13
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    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.

    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 ...

    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 !).

    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

    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, ...).

    @++

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 220
    Points : 48
    Points
    48
    Par défaut
    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.

    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.

    Peut-on en avoir le script ?
    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
    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
    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.

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

    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.

    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.

    @++

  15. #15
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    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

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE unification
    ADD new_type_tel_or_mail
    Puis effectuer le calcul suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

    @++

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 220
    Points : 48
    Points
    48
    Par défaut
    Bonjour

    Désoler pour le retard.

    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 : 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
     
    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

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

    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 :

    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.

    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

    @++

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 220
    Points : 48
    Points
    48
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  18. #18
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

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

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UPDATE TableA
    SET UneColonne = COALESCE(UneColonne, TableB.Col1),
    UneAutreColonne = COALESCE(UneAutreColonne, TableB.Col2)
    FROM TableB

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    220
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 220
    Points : 48
    Points
    48
    Par défaut
    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.

  20. #20
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/07/2014, 12h46
  2. update sur plusieurs lignes avec table temporaire
    Par -=mateo=- dans le forum SQL
    Réponses: 3
    Dernier message: 23/12/2010, 15h40
  3. UPDATE et Table temporaire
    Par dany13 dans le forum Développement
    Réponses: 5
    Dernier message: 10/12/2009, 15h38
  4. Nettoyage de table temporaire
    Par Alain Dionne dans le forum Bases de données
    Réponses: 5
    Dernier message: 28/02/2004, 21h44
  5. UPDATE : table à partir d'une autre
    Par Laura dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/10/2003, 22h34

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