tsql строка в столбец (сводная) - PullRequest
1 голос
/ 15 июля 2010

у меня есть таблица со следующей информацией

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

Я использовал sql ниже.

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  

Меня беспокоит то, что я могу неправильно указать дату рождения определенного ребенка-зависимого. Я новичок в sqlserver, и я использую sqlexpress (2008).

Любая помощь высоко ценится ...

Спасибо
Элмер

Ответы [ 2 ]

0 голосов
/ 03 декабря 2010

Предполагая, что зависимый идентификатор изменяется для каждого нового набора детей для каждой парентиды, вы не получите неправильную дату рождения, связанную с неправильным именем. Когда вы поворачиваете таблицу, вы присваиваете значение для строки этого родителя для данного столбца, которое является уникальным и непротиворечивым между сводками.

Другими словами, имя столбца [1] представляет значение зависимости 1; это не меняется от таблицы к таблице, поэтому при повороте во второй раз имя для строки 1 в исходной таблице связывается с датой рождения для строки 1.

Я хотел бы использовать функцию row_number () для определения порядка рождения вместо того, чтобы полагаться на зависимый идентификатор, но пока ваша бизнес-логика обеспечивает согласованность, реального преимущества нет.

0 голосов
/ 15 июля 2010

Исправление в операторе вставки

вставка в HR_DEPENDENTS (PARENT_ID, DEPENDENT_ID, LAST_NAME, first_name, date_of_birth)
значения (100, 1 , 'Ray', 'First Child', приведение ('06 / 01/2001' как дата))

вставить в HR_DEPENDENTS (PARENT_ID, DEPENDENT_ID, LAST_NAME, first_name, date_of_birth)
значения (100, 2 ,'Луч', 'Второй', приведение ('06 / 01/2002 'как дата))

вставка в HR_DEPENDENTS (PARENT_ID, DEPENDENT_ID, LAST_NAME, first_name, date_of_birth)
значения (100, 3 , 'Луч', 'Третий', приведение ('06 / 01/2003 'как дата))

год для date_of_birth отличается на 1 год.

С уважением,
Elmer

...