Sql 数据非规范化(可能是一个枢轴?)

Sql 数据非规范化(可能是一个枢轴?),sql,sql-server,tsql,sql-server-2008,Sql,Sql Server,Tsql,Sql Server 2008,我有一个简单的表,其中包含学生编号和相应的教师编号,我需要对其进行反规范化,以便输入到遗留系统 例如,现在的数据是这样的: 我希望它是这样的,将每个老师分成一个单独的列,从左到右填充列。一条商业规则是每个学生最多只能有六名教师: 原始表中有10000多行,因此我需要以编程方式执行此操作。 谢谢大家! 您可以使用pivot。你还需要给你的老师排名1-6。请参阅我对您希望如何执行此操作的评论。目前: Select StudNumber, TeacherNumber, TeacherRank from

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

例如,现在的数据是这样的:

我希望它是这样的,将每个老师分成一个单独的列,从左到右填充列。一条商业规则是每个学生最多只能有六名教师:

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

您可以使用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

然后你可以围绕这句话。这里有一个很好的解释:

传统的方法是使用;自SQLServer2005以来,您可以使用

案例示例:

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/etc是完全不同的事情。

I second PIVOT

下面是两个有趣的链接,它们提供了SQL中动态交叉表数据的编程解决方案


你打算和7+老师做什么?你如何确定哪些是1-6?哪一个是1-6并不重要,只要它们是从左到右填充的。根据商业规则,每个学生不会有超过6个提供者。将dinamic更改为dynamic。这正是我所需要的——对他们进行排名,以便我能够进行重点分析。非常感谢你!这就是pivot在没有黑魔法和特殊语法的情况下在引擎盖下所做的。。。
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
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