数据去规范化(可能是数据透视表)

3

我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有一个简单的表格,其中包含学生编号和相应的教师编号,我需要将其去规范化以输入到传统系统中。

例如,现在数据看起来像这样:


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<br>

原始表格中有10,000+行,因此我需要编写程序来完成这个任务。

谢谢!

你打算如何处理第七位及以上的老师,以及如何确定哪些是1-6? - JeffO
无论是1-6中的哪一个,只要从左到右填充即可。由于业务规则,每个学生最多不会超过6个供应商。 - Daniel
3个回答

7

您可以使用数据透视表。您还需要将您的老师按照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

那么您可以在此语句上进行数据透视。这里有一个很好的解释:使用 Pivot 和 UnPivot


这正是我所需要的——对它们进行排名,以便我可以转向。非常感谢! - Daniel

1

传统的方法是使用CASE表达式;自从SQL Server 2005以来,您可以使用PIVOT

CASE示例:

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

但是动态地将给定的教师编号放置为teacher1 / etc是完全不同的问题。


这就是在没有“黑魔法”和特殊语法的情况下,Pivot在幕后所做的事情... - Bennett Dill

1

将“dinamic”更改为“dynamic”。 - OMG Ponies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接