【问题标题】:Denormalizing Data (Maybe A Pivot?)非规范化数据(也许是一个枢轴?)
【发布时间】:2017-10-25 04:44:44
【问题描述】:

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

例如,现在的数据如下所示:


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 多行,因此我需要以编程方式执行此操作。 谢谢!

【问题讨论】:

  • 你打算和 7th+ 老师一起做什么,你如何确定哪些是 1-6?
  • 1-6 中的哪一个并不重要,只要从左到右填充即可。由于业务规则,每个学生的提供者不会超过 6 个。

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


【解决方案1】:

您可以使用枢轴。你还需要给你的老师“排名”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

【讨论】:

  • 这正是我所需要的——对它们进行排名以便我可以调整。非常感谢!
【解决方案2】:

老派的方法是使用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/等是完全不同的事情。

【讨论】:

  • 这就是 pivot 在没有“黑魔法”和特殊语法的情况下所做的事情......
【解决方案3】:

我是第二个 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/

【讨论】:

  • 将“动态”改为“动态”。
猜你喜欢
  • 1970-01-01
  • 2017-01-14
  • 2012-09-23
  • 2010-10-06
  • 1970-01-01
  • 2013-12-11
  • 2013-01-18
  • 2016-07-23
  • 1970-01-01
相关资源
最近更新 更多