tsql行到列(pivot)

时间:2010-07-15 08:17:43

标签: sql-server tsql 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)) 

我使用下面的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  

我担心的是,我可能会得到一个特定受抚养子女的错误date_of_birth 我是sqlserver的新手,我正在使用sqlexpress(2008)。

非常感谢任何帮助...

谢谢你 埃尔默

2 个答案:

答案 0 :(得分:0)

对插入语句进行更正

插入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年。

的问候,
埃尔默

答案 1 :(得分:0)

假设每个新生儿的每个新孩子的依赖身份都会发生变化,您将无法获得与错误姓名相关的错误出生日期。当您旋转表时,您将为该父项的行分配一个值,该值对于给定列是唯一且在枢轴之间一致的。

换句话说,列名[1]表示依赖值1;不会在表之间发生变化,因此当您第二次进行数据透视时,源表中第1行的第一个名称与第1行的birth_date相关联。

我很想使用row_number()函数来确定出生顺序,而不是依赖依赖的id,但只要你的业务逻辑强制实现一致性,就没有真正的优势。