将表格行转到列

时间:2010-08-02 11:49:54

标签: sql sql-server tsql

我正在使用SQLServer2008 Express
我有一个表和一个脚本将行转换为具有预期结果的列

PARENT_ID   name01  name02  name03  name04  
1           ABC     DEF     ABC2    DEF2
2            DEF3    null    null    null

但是,我得到了结果

PARENT_ID    name01    name02    name03    name04  
1            ABC       DEF       ABC2      DEF2
2            null      null      null      null  

我知道代码有问题,只是我无法理解。希望有人可以提供帮助。

CREATE TABLE #temp (
    parent_id            bigint NOT NULL
    ,dependent_id        bigint not null
    ,date_of_birth       date not null
    ,last_name           varchar(100)
    ,first_name           varchar(100)
    ,effective_start_date date
    ,effective_end_Date   date
)  
insert into #temp values (1,1,'1990-10-01','ABC',null,'1989-01-01','9999-12-31')  
insert into #temp values (1,2,'1991-06-02','DEF',null,'1989-01-01','9999-12-31')  
insert into #temp values (1,3,'1992-06-02','ABC2',null,'1989-01-01','9999-12-31')  
insert into #temp values (1,4,'1993-06-02','DEF2',null,'1989-01-01','9999-12-31')  
insert into #temp values (2,5,'2000-06-02','DEF3',null,'1989-01-01','9999-12-31')  

SELECT PARENT_ID  
    ,[1] as name01  
    ,[2] as name02  
    ,[3] as name03  
    ,[4] as name04  
FROM ( SELECT top(100)  percent
    PARENT_ID  
   , dependent_id  
   , (isnull(first_name,'')+last_name) as fullname  
FROM #temp  
where GETDATE() between effective_start_date and effective_end_Date  
order by date_of_birth  
   ) AS piv  
PIVOT ( max(fullname)  
  FOR dependent_id IN ([1], [2], [3], [4])  
  ) AS chld  

由于 埃尔默

1 个答案:

答案 0 :(得分:2)

数据有问题而不是我认为的代码。您是在dependent_id插入5,但希望它出现在1列中?

你可以使用dependent_id % 4,但我不确定这里的目的是什么?

修改在您发表评论后,我认为您需要这个吗?

SELECT PARENT_ID  
    ,[1] as name01  
    ,[2] as name02  
    ,[3] as name03  
    ,[4] as name04  
FROM 
(
  SELECT  
    PARENT_ID,
    ROW_NUMBER() OVER (PARTITION BY PARENT_ID ORDER BY date_of_birth) AS RN
   , (isnull(first_name,'')+last_name) as fullname  
FROM #temp  
where GETDATE() between effective_start_date and effective_end_Date  
) AS piv  
PIVOT ( max(fullname)  
  FOR RN IN ([1], [2], [3], [4])  
  ) AS chld