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 :

Juxtaposition de lignes en colonnes


Sujet :

Développement SQL Server

  1. #1
    Membre habitué Avatar de LeCygne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2010
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2010
    Messages : 91
    Points : 159
    Points
    159
    Par défaut Juxtaposition de lignes en colonnes
    Bonjour,

    Afin de faire une extraction à plat d'une base, je souhaite juxtaposer les lignes des enfants sur la même ligne que leur parent. Les parents sont dans la table personne et les enfants dans la table Enfant. Voici un exemple du contenu de mes tables :

    [per_Personne]
    per_ID per_Nom per_Prenom
    1 COTILLARD Jean
    2 DUJARDIN Richard
    3 ANCONINA Marion
    [enf_Enfant]
    enf_ID per_ID_Parent_fk sex_ID_Sexe_fk enf_DateNaissance
    1 1 Feminin 2007-01-01
    2 1 Masculin 2007-01-02
    3 2 Masculin 2010-02-01
    4 2 Masculin 2010-02-02
    5 2 Feminin 2010-02-03
    6 3 Feminin 2014-03-01

    Il n'y a pas de limite pour le nombre d'enfant. Mais en la fixant à 3, Je voudrais avoir le rendu suivant :

    per_ID per_Nom per_Prenom enf1_Sexe enf1_DteNaiss enf2_Sexe enf2_DteNaiss enf3_Sexe enf3_DteNaiss
    1 COTILLARD Jean Feminin 2007-01-01 Masculin 2007-01-02
    2 DUJARDIN Richard Masculin 2010-02-01 Masculin 2010-02-02 Feminin 2010-02-03
    3 ANCONINA Marion Feminin 2014-03-01

    Mon problème est, une fois n'est pas coutume de savoir vers où commencer mes recherches. J'ai bien regarder du coté de PIVOT, mais cela ne semble pas correspondre. quelqu'un aurait il une solution à me suggérer ?

    Voici le code de creation de l'exemple :

    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
     
    /*********************************************
    per_Personne
    **********************************************/
    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[per_Personne]') AND type in (N'U'))
    BEGIN
    CREATE TABLE [dbo].[per_Personne] 
    	(
    	per_ID INT IDENTITY(1,1) NOT NULL, 
    	per_Nom VARCHAR(256) , 
    	per_Prenom VARCHAR(128) , 
    	CONSTRAINT pk_per_ID PRIMARY KEY CLUSTERED (per_ID),
    	)
    END
    GO
     
     
    /*********************************************
    enf_Enfant
    **********************************************/
    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[enf_Enfant]') AND type in (N'U'))
    BEGIN
    CREATE TABLE [dbo].[enf_Enfant] 
    	(
    	enf_ID INT IDENTITY(1,1) NOT NULL,
    	per_ID_Parent_fk INT NOT NULL, 
    	sex_ID_Sexe_fk VARCHAR(16) NOT NULL, 
    	enf_DateNaissance DATETIME, 
    	CONSTRAINT pk_enf_ID PRIMARY KEY CLUSTERED (enf_ID),
    	CONSTRAINT fk_enf_per_ID FOREIGN KEY (per_ID_Parent_fk) REFERENCES per_Personne(per_ID), 
    	)
    CREATE INDEX [I_per_ID_Parent_FK] ON [dbo].[enf_Enfant] (per_ID_Parent_fk)
    END
    GO
     
    INSERT INTO [dbo].[per_Personne] ([per_Nom], [per_Prenom])  VALUES ('COTILLARD' , 'Jean'    );
    INSERT INTO [dbo].[per_Personne] ([per_Nom], [per_Prenom])  VALUES ('DUJARDIN'  , 'Richard' );
    INSERT INTO [dbo].[per_Personne] ([per_Nom], [per_Prenom])  VALUES ('ANCONINA'  , 'Marion'  );
    GO
     
     
    INSERT INTO [dbo].[enf_Enfant]   ([per_ID_Parent_fk], [sex_ID_Sexe_fk], [enf_DateNaissance]) ( SELECT [per_ID], 'Feminin', CONVERT(DATETIME, '01/01/2007', 103) FROM [dbo].[per_Personne] WHERE ( [dbo].[per_Personne].[per_Nom] = 'COTILLARD' AND [dbo].[per_Personne].[per_Prenom] = 'Jean' ))
    INSERT INTO [dbo].[enf_Enfant]   ([per_ID_Parent_fk], [sex_ID_Sexe_fk], [enf_DateNaissance]) ( SELECT [per_ID], 'Masculin', CONVERT(DATETIME, '02/01/2007', 103) FROM [dbo].[per_Personne] WHERE ( [dbo].[per_Personne].[per_Nom] = 'COTILLARD' AND [dbo].[per_Personne].[per_Prenom] = 'Jean' ))
     
    INSERT INTO [dbo].[enf_Enfant]   ([per_ID_Parent_fk], [sex_ID_Sexe_fk], [enf_DateNaissance]) ( SELECT [per_ID], 'Masculin', CONVERT(DATETIME, '01/02/2010', 103) FROM [dbo].[per_Personne] WHERE ( [dbo].[per_Personne].[per_Nom] = 'DUJARDIN' AND [dbo].[per_Personne].[per_Prenom] = 'Richard' ))
    INSERT INTO [dbo].[enf_Enfant]   ([per_ID_Parent_fk], [sex_ID_Sexe_fk], [enf_DateNaissance]) ( SELECT [per_ID], 'Masculin', CONVERT(DATETIME, '02/02/2010', 103) FROM [dbo].[per_Personne] WHERE ( [dbo].[per_Personne].[per_Nom] = 'DUJARDIN' AND [dbo].[per_Personne].[per_Prenom] = 'Richard' ))
    INSERT INTO [dbo].[enf_Enfant]   ([per_ID_Parent_fk], [sex_ID_Sexe_fk], [enf_DateNaissance]) ( SELECT [per_ID], 'Feminin',  CONVERT(DATETIME, '03/02/2010', 103) FROM [dbo].[per_Personne] WHERE ( [dbo].[per_Personne].[per_Nom] = 'DUJARDIN' AND [dbo].[per_Personne].[per_Prenom] = 'Richard' ))
     
    INSERT INTO [dbo].[enf_Enfant]   ([per_ID_Parent_fk], [sex_ID_Sexe_fk], [enf_DateNaissance]) ( SELECT [per_ID], 'Feminin', CONVERT(DATETIME, '01/03/2014', 103) FROM [dbo].[per_Personne] WHERE ( [dbo].[per_Personne].[per_Nom] = 'ANCONINA' AND [dbo].[per_Personne].[per_Prenom] = 'Marion' ))
    GO

  2. #2
    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 serait préférable de traiter cela coté applicatif.

    néanmoins, il est possible de le faire en SQL comme ceci :

    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
     
    WITH CTE AS (
    	SELECT 
    			p.per_ID
    		,	p.per_Nom
    		,	p.per_Prenom
    		,	e.sex_ID_Sexe_fk
    		,	e.enf_DateNaissance
    		,	ROW_NUMBER() OVER(PARTITION BY p.per_ID ORDER BY e.enf_DateNaissance DESC) AS Rn
    	FROM per_Personne p
    	INNER JOIN enf_Enfant e
    		ON e.per_ID_Parent_fk = p.per_ID
    )
    SELECT
    			per_ID
    		,	per_Nom
    		,	per_Prenom
    		,	MAX(CASE WHEN Rn = 1 THEN sex_ID_Sexe_fk END) AS enf1_sexe
    		,	MAX(CASE WHEN Rn = 1 THEN enf_DateNaissance END) AS enf1_naissance
    		,	MAX(CASE WHEN Rn = 2 THEN sex_ID_Sexe_fk END) AS enf2_sexe
    		,	MAX(CASE WHEN Rn = 2 THEN enf_DateNaissance END) AS enf2_naissance
    		,	MAX(CASE WHEN Rn = 3 THEN sex_ID_Sexe_fk END) AS enf3_sexe
    		,	MAX(CASE WHEN Rn = 3 THEN enf_DateNaissance END) AS enf3_naissance
    FROM CTE
    GROUP BY 
    			per_ID
    		,	per_Nom
    		,	per_Prenom

  3. #3
    Membre habitué Avatar de LeCygne
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2010
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2010
    Messages : 91
    Points : 159
    Points
    159
    Par défaut
    Alors là: parfait ! C'est exactement ce que je demandais. Merci
    Me reste plus qu'a décortiquer ca pour comprendre le comment...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [T-SQL] Convertir des lignes en colonne
    Par cortex93 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/12/2005, 16h17
  2. Supprimer toutes les lignes et colonnes d'un tableau
    Par pekka77 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 01/12/2005, 11h26
  3. Tableau 5 lignes * 3 colonnes
    Par slackjayo dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 05/04/2005, 11h27
  4. Demande de conseil pour migration de lignes vers colonnes
    Par ririd dans le forum Administration
    Réponses: 6
    Dernier message: 04/11/2004, 17h02
  5. [TSynMemo] Positionnement par ligne et colonne
    Par Mercilius dans le forum Composants VCL
    Réponses: 9
    Dernier message: 16/04/2003, 16h22

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