2009-10-30 39 views
2

我有一张从Excel电子表格导入的大表格。对于包含教师姓名的五列,我想折叠每行中的所有空白,所以我没有任何姓名左侧的空白。一个例子可能会更好地表明我的意思。折叠每行的空白列

这里的数据的例子现在:

Student ID Teacher1 Teacher2 Teacher3 Teacher4 Teacher5 
445633  Mary    Deb  Juan 
876302  Trevor Juan  Mary  Val  Deb 
659404  Luo          Trevor 
535485       Deb  
775431    Val       Luo 
565002    Luo  Mary    Juan 

而且我想空白崩溃的左侧,所以它看起来是这样的:

Student ID Teacher1 Teacher2 Teacher3 Teacher4 Teacher5 
445633  Mary  Deb  Juan  
876302  Trevor Juan  Mary  Val  Deb 
659404  Luo  Trevor  
535485  Deb   
775431  Val  Luo  
565002  Luo  Mary  Juan 

我必须这样做这种方式是因为我将它粘贴到一个国家规定的Excel模板中,而且我无法在教师姓名的左边留下任何空白,只有空白才是正确的。

谢谢!

回答

2

您可以逆透视,ROW_NUMBER()在教师和枢轴再次...那就是:

declare @t1 as table (StudentID int, Teacher1 nvarchar(100), Teacher2 nvarchar(100), Teacher3 nvarchar(100), Teacher4 nvarchar(100), Teacher5 nvarchar(100)); 
insert into @t1 values (445633,'Mary',NULL,'Deb','Juan',NULL),(876302,'Trevor','Juan','Mary','Val','Deb'), 
(659404,'Luo',NULL,NULL,NULL,'Trevor'),(535485,NULL,NULL,NULL,'Deb',NULL), 
(775431,NULL,NULL,'Val',NULL,'Luo'),(565002,NULL,NULL,'Luo','Mary','Juan'); 

with UnpivotT as (
    SELECT StudentID, TeacherName, TeacherColumn as OriginalColumn 
    from @t1 unpivot (
     TeacherName for TeacherColumn in ([Teacher1],[Teacher2],[Teacher3],[Teacher4],[Teacher5]) 
    ) uT 
), NewColumnT as (
    select StudentID, TeacherName, 'Teacher'+(
      convert(nvarchar(100), ROW_NUMBER() OVER (PARTITION BY StudentID ORDER BY OriginalColumn)) 
     ) as NewColumn 
    from UnpivotT 
) 
select * 
from NewColumnT 
pivot (
    max(TeacherName) for NewColumn in ([Teacher1],[Teacher2],[Teacher3],[Teacher4],[Teacher5]) 
) as pivotT 
+0

非常感谢您! – Daniel