2010-07-15 7 views
1

i possède une table avec les informations suivantesrangée tsql à la colonne (pivot)

CREATE TABLE [dbo].[HR_DEPENDENTS]( 
      [PARENT_ID]  [bigint]  NOT NULL, 
      [DEPENDENT_ID] [bigint]  NOT NULL, 
      [LAST_NAME]  [varchar](100) NOT NULL, 
      [FIRST_NAME] [varchar](100)  NULL, 
      [DATE_OF_BIRTH] [date]    NULL) 

insert into HR_DEPENDENTS (PARENT_ID, DEPENDENT_ID, LAST_NAME, first_name, date_of_birth) 
values (100, 1, 'Ray', 'First Child',cast('06/01/2001' as date)) 

insert into HR_DEPENDENTS (PARENT_ID, DEPENDENT_ID, LAST_NAME, first_name, date_of_birth) 
values (100, 2, 'Ray', 'Second', cast('06/01/2002'as date)) 

insert into HR_DEPENDENTS (PARENT_ID, DEPENDENT_ID, LAST_NAME, first_name, date_of_birth) 
values (100, 3, 'Ray', 'Third',cast('06/01/2003' as date)) 

je SQL ci-dessous.

SELECT t01.parent_id 
    ,t01.taxdepn1 
    ,t01.taxdepn2 
    ,t01.taxdepn3 
    ,t01.taxdepn4 
    ,t02.depn1bday 
    ,t02.depn2bday 
    ,t02.depn3bday 
    ,t02.depn4bday 
FROM (SELECT PARENT_ID 
    ,[1] as taxdepn1 
    ,[2] as taxdepn2 
    ,[3] as taxdepn3 
    ,[4] as taxdepn4 
    FROM (SELECT PARENT_ID 
     , dependent_id 
     , first_name+' '+last_name as fullname 
     FROM dbo.hr_dependents 
     ) AS piv 
    PIVOT (max(fullname) 
      FOR dependent_id IN ([1], [2], [3], [4]) 
     ) AS chld 
    ) T01 
    ,(SELECT PARENT_ID2 
      , [1] as depn1bday 
      , [2] as depn2bday 
      , [3] as depn3bday 
      , [4] as depn4bday 
     FROM (SELECT PARENT_ID as parent_id2 
        ,dependent_id 
        ,date_of_birth 
      FROM dbo.hr_dependents) AS piv1 
     PIVOT (min(date_of_birth) 
       FOR dependent_id IN ([1], [2], [3], [4]) 
      ) AS chld1 
    ) T02 
WHERE T01.PARENT_ID=T02.PARENT_ID2 

Mon inquiétude est que je peux avoir la mauvaise date_of_birth d'un enfant particulier.
Je suis nouveau sur sqlserver et j'utilise sqlexpress (2008).

Toute aide est très appréciée ...

Merci Vous
Elmer

+0

Les parents, dans cet exemple, sont très cohérents et reproductibles. Un enfant à la même date de l'année. – Kashif

Répondre

0

Correction sur l'instruction d'insertion

insert dans HR_DEPENDENTS (PARENT_ID, DEPENDENT_ID, LAST_NAME, prenom, DATE_OF_BIRTH)
valeurs (100, , 'Ray', 'First Child', cast ('06/01/2001 'comme date))

insert dans HR_DEPENDENTS (id_parent, DEPENDENT_ID, LAST_NAME, prenom, date_of_birth)
valeurs (100, , 'Ray', 'Second', casting ('06/01/2002'as date))

insert dans HR_DEPENDENTS (id_parent, DEPENDENT_ID, LAST_NAME, prenom, date_of_birth)
valeurs (100, , 'Ray', 'troisième', casting ('06/01/2003' comme la date))

l'année pour date_of_birth diffère d'un an.

Cordialement,
Elmer

+0

a mis à jour votre insertion dans la question. –

0

En supposant que les changements d'identité à charge pour chaque nouvel ensemble d'enfants pour chaque parentid, vous ne serez pas obtenir la date de naissance erronée associée au mauvais nom. Lorsque vous faites pivoter la table, vous affectez une valeur à une ligne pour ce parent à une colonne donnée unique et cohérente entre les pivots. En d'autres termes, le nom de la colonne [1] représente la valeur dépendante 1; cela ne change pas de table en table, donc lorsque vous faites pivoter la deuxième fois, le prénom de la ligne 1 dans la table source est associé à birth_date pour la ligne 1.

Je serais tenté d'utiliser le numéro de rangée() fonction de déterminer un ordre de naissance au lieu de s'appuyer sur un ID dépendant, mais tant que votre logique métier applique la cohérence, il n'y a pas de réel avantage.

Questions connexes