我有一个包含学生编号和相应教师编号的简单表格,我需要对其进行非规范化以输入遗留系统。
例如,以下是数据现在的样子:
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多行,因此我需要以编程方式执行此操作。 谢谢!
答案 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/