Денормализация данных (возможно, сводная?) - PullRequest
3 голосов
/ 02 ноября 2009

У меня есть простая таблица, содержащая номера учеников и соответствующие номера учителей, и мне нужно денормализовать ее для ввода в унаследованную систему.

Например, вот как теперь выглядят данные:

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

Мне бы хотелось, чтобы это выглядело следующим образом: каждый Учитель разделен на отдельные столбцы, заполняющие столбцы слева направо. Одно бизнес-правило состоит в том, что на каждого ученика может приходиться не более шести учителей:

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

В исходной таблице более 10000 строк, поэтому мне нужно сделать это программно. Спасибо!

Ответы [ 3 ]

7 голосов
/ 02 ноября 2009

Вы можете использовать пивот. Вы также должны «ранжировать» своих учителей 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

1 голос
/ 03 ноября 2009

Я второй PIVOT.

Вот две интересные ссылки с программными решениями для динамических данных перекрестной таблицы в SQL.

http://www.simple -talk.com / SQL / T-SQL-программирование / создание-Cross-Tab-запросы-и-поворотные столы-в-SQL /

http://www.simple -talk.com / SQL / T-SQL-программирование / перекрестный-поворотный стол-верстак /

1 голос
/ 02 ноября 2009

В старой школе используется 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

Но динамическое размещение заданного числа в качестве учителя1 / и т. Д. - это совсем другое дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...