Поворот двух столбцов - PullRequest
0 голосов
/ 31 марта 2020

У меня есть данные, которые выглядят как:

stu_id ......... имя_курса ................ staff_name
1 .................. Экономика - 3 ................ Кузьма, Брайан
1 .. ................ История ............................ Hulings, Kreg
1 .................. IHS IB Lit of Ameri c ...... Дункан, Эми
2 ......... ......... Морская биология A ........... Экипажи, Эрин
2 .................. Предварительно Исчисление ................. Содерхольм, Лоди
2 ................. Environ & Wld Iss .... ...... Хаберман, Хелен

Я пытаюсь отформатировать его так, используя SQL, чтобы данные каждого учащегося были все в одном ряду:

stu_id ......... course1 ................ персонала1 ................... ... course2 ................ staff2 et c ...
1 ............... .Экономика - 3 ........ Кузьма, Брайан .......... История .................. Хьюлингс, Крег и др. c ...
2 ................ Морская биология A .... Экипажи, Эрин .............. Предварительно Исчисление ........ Содерхольм, Лоди и др. * 10 93 * ...



У каждого учащегося может быть до 6 курсов и связанных с ним имен сотрудников, которые объединены в одну строку.
Основной запрос c:

выберите
dtbl_students.student_id stu_id,
имя_курса,
staff_name
из K12INTEL_DW.FTBL_STUDENT_SCHEDULES
ВНУТР. STUDENT_KEY
внутреннее соединение K12INTEL_DW.DTBL_staff С (NOLOCK) ON FTBL_STUDENT_SCHEDULES.staff_KEY = DTBL_staff.staff_KEY
INNER JOIN K12INTEL_DW.DTBL_COURSES С (NOLOCK) ON FTBL_STUDENT_SCHEDULES.COURSE_KEY = DTBL_COURSES.COURSE_KEY
INNER JOIN K12INTEL_DW.DTBL_SCHOOLS С (NOLOCK) ПО FTBL_STUDENT_SCHEDULES.SCHOOL_KEY = DTBL_SCHOOLS.SCHOOL_KEY
INNER JOIN K12INTEL_DW.DTBL_SCHOOL_DATES period_date С (NOLOCK) ПО FTBL_STUDENT_SCHEDULES.SCHOOL_DATES_KEY = period_date.SCHOOL_DATES_KEY
, где
local_school_year = '2019-2020' и
local_semest er = 3

Я пытаюсь повернуть курс по имени курса и имени сотрудника.
Мне удалось ОТВЕРЖДИТЬСЯ так:

с курсами как (
выберите
dtbl_students.student_id stu_id,
имя_класса,
staff_name
из K12INTEL_DW.FTBL_STUDENT_SCHEDULES
INNER JOIN K12INTEL_DW.DTBL_STUDENTSSTSTST_STLTSTTSTLTSTTSTLTSTTSTLTSTLTSTTSTLTSTTSTLTSTTSTLTSTTSTLTSTTSTLTINGTSTLTSTTSTTSTTENTSTLTSTK! * * тысяча пятьдесят-шесть внутреннее соединение K12INTEL_DW.DTBL_staff С (NOLOCK) НА FTBL_STUDENT_SCHEDULES.staff_KEY = DTBL_staff.staff_KEY
INNER JOIN K12INTEL_DW.DTBL_COURSES С (NOLOCK) ПО FTBL_STUDENT_SCHEDULES.COURSE_KEY = DTBL_COURSES.COURSE_KEY
INNER JOIN K12INTEL_DW.DTBL_SCHOOLS с ( NOLOCK) ON FTBL_STUDENT_SCHEDULES.SCHOOL_KEY = DTBL_SCHOOLS.SCHOOL_KEY
INNER JOIN K12INTEL_DW.DTBL_SCHOOL_DATES period_date С (NOLOCK) ON FTBL_STUDENT_SCHEDULES.SCHOOL_DATES_KEY = period_date.SCHOOL_DATES_KEY
, где
local_school_year = '2019-2020' и
local_semest er = 3
)
выберите * из КУРСОВ
unpivot
(
course
для значения в ([имя_курса], [staff_name])
) unpiv

, который производит что-то вроде:

stu_id .............. курс ...... .................. значение
1 ................... IHS IB Economics - 3 ....... имя_курса
1 ................... Кузьма, Брайан ................ ... staff_name
1 ................... IHS IB История истории .......... course_name
1 ... ................ Hulings, Kreg ................... имя_персонала

Я экспериментировал с unpivot затем pivot или два центра, используя все примеры, которые я могу найти в Переполнении стека и в других местах, но безуспешно.

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Если у вас есть известное или максимальное количество пар И , которое вы хотите попробовать PIVOT

Пример

Select *
 From  (
        Select A.stu_id
              ,B.*
         From ( 
                Select *
                      ,RN = row_number() over (partition by stu_id order by course_name) 
                 from YourTable
               ) A
         Cross Apply ( values (concat('course_',RN),course_name)
                             ,(concat('staff_',RN),staff_name)
                     ) B(Item,Value)
       ) src
 Pivot (max(Value) for Item in ([Course_1],[Staff_1],[Course_2],[Staff_2],[Course_3],[Staff_3] )) pvt

Возвраты

enter image description here

0 голосов
/ 31 марта 2020

Я бы предложил row_number() перечислить столбцы, затем условное агрегирование:

select
    stu_id,
    max(case when rn = 1 then course_name end) course1,
    max(case when rn = 1 then staff_name end) staff1,
    max(case when rn = 2 then course_name end) course2,
    max(case when rn = 2 then staff_name end) staff2,
    ...
    max(case when rn = 6 then course_name end) course6,
    max(case when rn = 6 then staff_name end) staff6
from (
    select t.*, row_number() over(partition by stu_id order by course_name) rn
    from mytable t
) t
group by stu_id

Это даст вам 6 пар столбцов для каждого stu_id с соответствующими курсом и именами сотрудников. Курсы отсортированы в алфавитном порядке по столбцам. Если у ученика менее 6 курсов, последние столбцы будут пустыми.

Мне совершенно неясно, как соотносятся ваш запрос и данные примера. Этот ответ основан на данных выборки и ожидаемых результатах.

...