【问题标题】:tsql row to column (pivot)tsql 行到列(枢轴)
【发布时间】:2010-07-15 08:17:43
【问题描述】:

我有一张包含以下信息的表格

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

任何帮助都非常感谢......

谢谢
埃尔默

【问题讨论】:

  • 在此示例中,父母非常一致且可重复。一年中同一天的孩子。

标签: sql-server tsql pivot


【解决方案1】:

插入语句的更正

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

插入 HR_DEPENDENTS(PARENT_ID、DEPENDENT_ID、LAST_NAME、first_name、date_of_birth)
值 (100, 2, 'Ray', 'Second', cast('06/01/2002'as date))

插入 HR_DEPENDENTS(PARENT_ID、DEPENDENT_ID、LAST_NAME、first_name、date_of_birth)
值 (100, 3, 'Ray', 'Third',cast('06/01/2003' as date))

date_of_birth 的年份相差 1 年。

问候,
埃尔默

【讨论】:

    【解决方案2】:

    假设每个 parentid 的每组新孩子的依赖 id 都发生了变化,那么您将不会得到与错误姓名相关联的错误出生日期。当您对表进行透视时,您正在为该父行的行分配一个值,该值在透视之间是唯一且一致的给定列。

    也就是说,列名[1]代表dependentid值1;这不会因表而异,因此当您第二次旋转时,源表中第 1 行的名字与第 1 行的birth_date 相关联。

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

    【讨论】:

      猜你喜欢
      • 2017-09-10
      • 2016-05-22
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多