非规范化数据(也许是一个转轴?)

时间:2009-11-02 20:31:48

标签: sql sql-server tsql sql-server-2008

我有一个包含学生编号和相应教师编号的简单表格,我需要对其进行非规范化以输入遗留系统。

例如,以下是数据现在的样子:


StudNumber  TeacherNumber
445        57315
445        88584
445        95842
858        88115
858        65443
858        57315
858        21144
858        18657
858        88584
311        64521
665        35512
665        57315
665        15546

我希望它看起来像这样,将每个教师分成一个单独的列,从左到右填充列。一个商业规则是每个学生的教师不超过六名:


StudNum Teacher1    Teacher2    Teacher3    Teacher4    Teacher5    Teacher6
445     57315       88584        95842
858     88115       65443        57315      21144        18657      88584
311     64521
665     35512       57315        15546

原始表中有10,000多行,因此我需要以编程方式执行此操作。 谢谢!

3 个答案:

答案 0 :(得分:7)

您可以使用pivot。你还需要“排名”你的老师1-6。请参阅我对您希望如何执行此操作的评论。现在:

Select StudNumber, TeacherNumber, TeacherRank
from (
   Select ST.StudNumber
       , ST.TeacherNumber
       , ROW_NUMBER() OVER (PARTITION BY ST.StudNumber 
                    ORDER BY ST.TeacherNumber) AS TeacherRank
   From StudentTeacher AS ST)
Where TeacherRank <=6

然后你可以转向这个陈述。这是一个很好的解释:Using Pivot and UnPivot

答案 1 :(得分:1)

旧学校方法是使用CASE expressions;从SQL Server 2005开始,您可以使用PIVOT

案例:

SELECT t.studnumber,
       CASE WHEN t.teachernumber = 57315 THEN t.teachernumber ELSE NULL END AS TEACHER1,
       CASE WHEN t.teachernumber = 88115 THEN t.teachernumber ELSE NULL END AS TEACHER1

但动态地将一个给定的教师作为教师1 /等是完全不同的事情。

答案 2 :(得分:1)

我第二次PIVOT。

以下是两个有趣的链接,其中包含SQL中动态交叉表数据的编程解决方案。

http://www.simple-talk.com/sql/t-sql-programming/creating-cross-tab-queries-and-pivot-tables-in-sql/

http://www.simple-talk.com/sql/t-sql-programming/crosstab-pivot-table-workbench/