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 :

Compléter les champs vides d'une ligne à partir de la ligne précédente.


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué Avatar de Rad Wulf
    Homme Profil pro
    Software Support Specialist
    Inscrit en
    Mars 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Software Support Specialist
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 7
    Par défaut Compléter les champs vides d'une ligne à partir de la ligne précédente.
    Bonjour,

    J'essaie désepérément de Compléter les champs vides de lignes à partir de la ligne qui les précèdent.
    Sans que les lignes qui ne sont pas complétement vides aient leur données existantes écrasées.
    Et mon problème c'est que j'écrase les données existantes.

    Donc pour faire court j'ai ça:

    InfoID AdrTypeID Adresse1 Adresse2 Adresse3 Ville Province CodePostal Pays Telephone1 Telephone2 Mobile Fax Email WebSite IsTemplate CCEmail BCcEmail
    1 MAIN 1 rue du moulin CEDEX 2 LYON RHONE 69001 FR 0365666666 0 NULL NULL
    1 MAIL
    2 MAIN 33 bd Jean Jaures Belfort Territoire de Belfort 90000 FR 0389023658 0 NULL NULL
    2 MAIL
    3 MAIN 63 rue d'Alésia XIVeme Arrondissement PARIS ILE DE FRANCE 75014 FR 0142435869 0 NULL NULL
    3 MAIL 2 Avenue du G. Leclerc PARIS 0142435869

    Et je voudrais obtenir ça:

    InfoID AdrTypeID Adresse1 Adresse2 Adresse3 Ville Province CodePostal Pays Telephone1 Telephone2 Mobile Fax Email WebSite IsTemplate CCEmail BCcEmail
    1 MAIN 1 rue du moulin CEDEX 2 LYON RHONE 69001 FR 0365666666 0 NULL NULL
    1 MAIL 1 rue du moulin CEDEX 2 LYON RHONE 69001 FR 0365666666 0 NULL NULL
    2 MAIN 33 bd Jean Jaures Belfort Territoire de Belfort 90000 FR 0365666666 0 NULL NULL
    2 MAIL 33 bd Jean Jaures Belfort Territoire de Belfort 90000 FR 0365666666 0 NULL NULL
    3 MAIN 63 rue d'Alésia XIVeme Arrondissement PARIS ILE DE FRANCE 75014 FR 0142435869 0 NULL NULL
    3 MAIL 2 Avenue du G. Leclerc PARIS 0142435869

    Pouvez-vous m'aiguiller sur ce qui cloche dans mon code? Merci.


    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    DECLARE     @InfoID int, 
    		@Adresse1_Main      nvarchar(100),
    		@Adresse2_Main      nvarchar(100),
    		@Adresse3_Main      nvarchar(100),
    		@Ville_Main          nvarchar(100),
    		@Province_Main nvarchar(100),
                                    @CodePostal_Main       nvarchar (30),
    		@Pays_Main       nvarchar(100),
    		@Telephone1_Main  nvarchar (50),
    		@Telephone2_Main  nvarchar (50),
    		@Mobile_Main  nvarchar (50),
    		@Fax_Main     nvarchar (50),
    		@Email_Main         nvarchar(100),
    		@WebSite_Main       nvarchar(100),
    		@CCEmail_Main       nvarchar(100),
    		@BCcEmail_Main      nvarchar(100)  
     
    DECLARE Mailing_cursor CURSOR FAST_FORWARD FOR  
     
    SELECT [InfoID]            as InfoID
                 ,[Adresse1]      as Adresse1_Main
                 ,[Adresse2]      as Adresse2_Main
                 ,[Adresse3]      as Adresse3_Main
                 ,[Ville]              as Ville_Main
                 ,[Province]        as Province_Main
                 ,[CodePostal]    as CodePostal_Main
                 ,[Pays]                 as  Pays_Main
                 ,[Telephone1]  as Telephone1_Main
                 ,[Telephone2]  as Telephone2_Main
                 ,[Mobile]  as Mobile_Main
                 ,[Fax]     as Fax_Main
                 ,[Email]         as Email_Main
                 ,[WebSite]       as WebSite_Main
                 ,[CCEmail]       as CCEmail_Main
                 ,[BCcEmail]      as BCcEmail_Main
      FROM [Adresse]
      WHERE [AdrTypeID] = 'MAIN'
    	AND InfoID IN (SELECT InfoID--, COUNT(*)
    				  FROM  [dbo].[Adresse]
    				  WHERE [AdrTypeID] IN ('MAIN','MAIL')
    				  GROUP BY InfoID
    				  HAVING COUNT(*) > 1)
     
    OPEN Mailing_cursor  
     
    FETCH NEXT FROM Mailing_cursor   
    INTO @InfoID, @Adresse1_Main, @Adresse2_Main, @Adresse3_Main, @Ville_Main, @Province_Main, @CodePostal_Main, @Pays_Main, @Telephone1_Main, @Telephon2_Main, @Mobile_Main, @Fax_Main, 
         @Email_Main, @WebSite_Main, @CCEmail_Main, @BCcEmail_Main   
     
    WHILE @@FETCH_STATUS = 0
    BEGIN  
     
           UPDATE Adresse
           SET 
    	   Adresse1 = @Adresse1_Main
     
    	   WHERE InfoID= @InfoID
    	     AND AdrTypeID = 'MAIL' 
    		 AND (Adresse1 IS NULL OR Adresse1 <> '')
     
           UPDATE Adresse
           SET 
    	   Adresse2 = @Adresse2_Main
     
           WHERE InfoID= @InfoID
    	     AND AdrTypeID = 'MAIL' 
    	     AND (Adresse2 IS NULL OR Adresse2 <> '')
     
           UPDATE Adresse
           SET 
    	   Adresse3 = @Adresse3_Main
     
           WHERE InfoID= @InfoID
    	     AND AdrTypeID = 'MAIL' 
    	     AND (Adresse3 IS NULL OR Adresse3 <> '')
     
           UPDATE Adresse
           SET 
    	   Ville = @Ville_Main
     
           WHERE InfoID= @InfoID
    	     AND AdrTypeID = 'MAIL' 
    	     AND (Ville IS NULL OR Ville <> '')
     
           UPDATE Adresse
           SET 
    	   Province = @Province_Main
     
           WHERE InfoID= @InfoID
    	     AND AdrTypeID = 'MAIL' 
    	     AND (Province IS NULL OR Province <> '')
     
           UPDATE Adresse
           SET 
    	   CodePostal= @CodePostal_Main
     
           WHERE InfoID= @InfoID
    	     AND AdrTypeID = 'MAIL' 
    	     AND (CodePostal IS NULL OR CodePostal <> '')
     
           UPDATE Adresse
           SET 
    	   Pays = @Pays_Main
     
           WHERE InfoID= @InfoID
    	     AND AdrTypeID = 'MAIL' 
    	     AND (Pays  IS NULL OR Pays <> '')
     
           UPDATE Adresse
           SET 
    	   Telephone1 = @Telephone1_Main
     
           WHERE InfoID= @InfoID
    	     AND AdrTypeID = 'MAIL' 
    	     AND (Telephone1 IS NULL OR Telephone1 <> '')
     
           UPDATE Adresse
           SET 
    	   Telephone2 = @Telephone2_Main
     
          WHERE InfoID= @InfoID 
    	     AND AdrTypeID = 'MAIL' 
    	     AND (Telephone2 IS NULL OR Telephone2 <> '')
     
           UPDATE Adresse
           SET 
    	   Mobile = @Mobile_Main
     
          WHERE InfoID= @InfoID 
    	     AND AdrTypeID = 'MAIL' 
    	     AND (Mobile IS NULL OR Mobile <> '')
     
           UPDATE Adresse
           SET 
    	   Fax = @Fax_Main
     
          WHERE InfoID= @InfoID
    	     AND AdrTypeID = 'MAIL' 
    	     AND (Fax IS NULL OR Fax <> '')
     
           UPDATE Adresse
           SET 
    	   Email = @Email_Main
     
          WHERE InfoID= @InfoID 
    	     AND AdrTypeID = 'MAIL' 
    	     AND (Email IS NULL OR Email <> '')
     
           UPDATE Adresse
           SET 
    	   WebSite = @WebSite_Main
     
          WHERE InfoID= @InfoID 
    	     AND AdrTypeID = 'MAIL' 
    	     AND (WebSite IS NULL OR WebSite <> '')
     
           UPDATE Adresse
           SET 
    	   CCEmail = @CCEmail_Main
     
          WHERE InfoID= @InfoID 
    	     AND AdrTypeID = 'MAIL' 
    	     AND (CCEmail IS NULL OR CCEmail <> '')
     
           UPDATE Adresse 
           SET 
    	   BCcEmail = @BCcEmail_Main
     
          WHERE InfoID= @InfoID 
    	     AND AdrTypeID = 'MAIL' 
    	     AND (BCcEmail IS NULL OR BCcEmail <> '')
     
    	  FETCH NEXT FROM Mailing_cursor   
    	  INTO @InfoID, @Adresse1_Main, @Adresse2_Main, @Adresse3_Main, @Ville_Main, @Province_Main, @CodePostal_Main, @Pays_Main, @Telephone1_Main, @Telephon2_Main, @Mobile_Main, @Fax_Main, 
         @Email_Main, @WebSite_Main, @CCEmail_Main, @BCcEmail_Main   
     
     
    END   
     
    CLOSE Mailing_cursor;  
    DEALLOCATE Mailing_cursor;

  2. #2
    Membre habitué Avatar de Rad Wulf
    Homme Profil pro
    Software Support Specialist
    Inscrit en
    Mars 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Software Support Specialist
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2013
    Messages : 7
    Par défaut Bonjour
    Personne pour m'aiguiller vers une solution?
    Merci quand même.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2007
    Messages : 89
    Par défaut
    Bonjour,

    Citation Envoyé par Rad Wulf
    Personne pour m'aiguiller vers une solution?
    Respecter la charte de postage est un plus lorsque l'on est en quête de réponses
    Outre les règles de bases du forum, sqlpro (que je salue bien bas au passage ) a publié des outils pour aider à la constitution de jeu(x) d'essai.
    Si je n'avais pas lancé un très (trop ?) long traitement, je n'aurais jamais fait ce qui suit, et je suppose pour le coup que les autres membres du forum ne répondent pas pour cela.

    Vous n'indiquez pas non plus la version de l'instance SQL concernée, il y a donc peut-être plus simple mais ceci devrait passer à partir de 2008.
    Il suffira de remplacer la clause SELECT par l'UPDATE approprié, et un curseur ne peut vous tirer que vers le bas en termes de performance et de maintenance.

    Ce n'est peut-être pas la meilleure solution, mais a priori elle fonctionne.

    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
    67
    68
    69
    70
    71
    -- Base de test
    USE [Sandbox];
    GO
     
    -- Création de table
    CREATE TABLE Adresse(
    		InfoID INT NOT NULL
    	,	AdrTypeID NVARCHAR(10) NOT NULL
    	,	Adresse1 NVARCHAR(100)
    	,	Adresse2 NVARCHAR(100)
    	,	Adresse3 NVARCHAR(100)
    	,	Ville NVARCHAR(100)
    	,	Province NVARCHAR(100)
    	,	CodePostal NVARCHAR(30)
    	,	Pays VARCHAR(100)
    	,	Telephone1 VARCHAR(50)
    	,	Telephone2 VARCHAR(50)
    	,	Mobile VARCHAR(50)
    	,	Fax VARCHAR(50)
    	,	Email VARCHAR(100)
    	,	WebSite VARCHAR(100)
    	,	IsTemplate BIT NOT NULL
    	,	CCEmail VARCHAR(100)
    	,	BCcEmail VARCHAR(100)
    	);
     
    -- Population
    INSERT INTO Adresse VALUES
    		(1, 'MAIN', '1 rue du moulin', 'CEDEX 2', NULL, 'LYON', 'RHONE', '69001', 'FR', '0365666666', NULL, NULL, NULL, NULL, NULL, 0 ,NULL, NULL)
    	,	(1, 'MAIL', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL)
    	,	(2, 'MAIN', '33 bd Jean Jaures', NULL, NULL, 'Belfort', 'Territoire de Belfort', '90000', 'FR', '0389023658', NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL)
    	,	(2, 'MAIL', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL)
    	,	(3, 'MAIN', '63 rue d''Alésia', 'XIVeme Arrondissement', NULL, 'PARIS', 'ILE DE FRANCE', '75014', 'FR', '0142435869', NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL)
    	,	(3, 'MAIL', '2 Avenue du G. Leclerc', 'XIVeme Arrondissement', NULL, 'PARIS', NULL, NULL, NULL, '0142435869', NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL);
     
    -- Identification des lignes à traiter
    WITH Origine AS
    (
    SELECT
    		COALESCE(Adresse1, Adresse2, Adresse3, Ville, Province, CodePostal, Pays, Telephone1, Telephone2, Mobile, Fax, Email, WebSite, CCEmail, BCcEmail, '###A TRAITER') AS A_traiter
    	,	InfoID
    	,	AdrTypeID
    	,	Adresse1
    	,	Adresse2
    	,	Adresse3
    	,	Ville
    	,	Province
    	,	CodePostal
    	,	Pays
    	,	Telephone1
    	,	Telephone2
    	,	Mobile
    	,	Fax
    	,	Email
    	,	WebSite
    	,	CCEmail
    	,	BCcEmail
    FROM		Adresse
    WHERE	
    		-- A adapter aux besoins, absence notable de IsTemplate
    		COALESCE(Adresse1, Adresse2, Adresse3, Ville, Province, CodePostal, Pays, Telephone1, Telephone2, Mobile, Fax, Email, WebSite, CCEmail, BCcEmail, '###A TRAITER') = '###A TRAITER'
    )
     
    -- Sélection des lignes à traiter avec les données associées
    SELECT
    		Origine.*
    	,	Adresse.*
    FROM			Origine
    INNER JOIN		Adresse ON Origine.InfoID = Adresse.InfoID AND Origine.AdrTypeID <> Adresse.AdrTypeID;
     
    DROP TABLE Adresse;
    PS1 : Je suis parti du principe qu'il n'y avait que 2 lignes par InfoID.
    PS2 : Peut-être faudrait-il également filtrer sur la colonne IsTemplate par sécurité ?

    HTH,

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/08/2015, 18h16
  2. [Oracle] Ignorer les champs vides dans une requête sql
    Par roswina dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/05/2015, 09h29
  3. Utiliser les champs vides d'une table dans un code
    Par marcelstan dans le forum Access
    Réponses: 1
    Dernier message: 23/03/2015, 12h34
  4. [Requête/SQL] Compléter les champs d'une table
    Par arn.oo dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 24/04/2007, 13h57
  5. Réponses: 6
    Dernier message: 23/01/2007, 10h17

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