Member 10539656 Ответов: 2

Получить значения для одного и того же идентификатора в 1 строку, разделенную запятой в SQL Server 2008 R2


У меня есть запрос, который генерирует это

StudentID |Здание |Период |Класс
12345           2            1       11        
12345           2            5       11
43210           2            1       12

Но мне нужен способ сгруппировать периоды по StudentID:

StudentID |Здание |Период | Класс
12345           2            1,5     11
43210           2            1        12

Это мой вопрос:

выберите r.student_id [StudentID],
r.building [здание],
ab.attedancePeriod [период],
r.grade [класс]
из регистра r
внутреннее соединение att_bottom ab на ab.student_id = r.student_id
где ab.building = '2'
и ab.attendance_c = 'T'

Любые предложения более чем приветствуются!




Обновление
Приведенный ниже запрос извлекает все студенческие идентификаторы, назначенные зданию 2, независимо от того, имеют ли они код посещаемости T или нет на конкретную дату (сегодняшнюю дату).
Он присваивает нулевое значение тем, которые этого не делают, когда мне просто нужны те, которые это делают (которые будут иметь точку).


select r.student_id [StudentID],
           r.building [Building],
           (select ab.attendancePeriod + ','
                from att_bottom ab
                where ab.student_id = r.student_id
                and ab.building = '2'
                and ab.attendance_c ='T'
                AND CONVERT(varchar,ab.attendance_date,102) = convert(varchar,getdate(),102)
               FOR XML PATH ('') ) AS PERIOD,
                r.GRADE

               FROM register r


Результат

StudentID |Здание |Период |Класс
12345           2            1 ,        11        
43210           2            1 ,         12
98775           2           НУЛЕВОЙ   10

2 Ответов

Рейтинг:
0

Christian Graus

SQL Wizardry Part Seven - сводные и произвольные списки данных[^] показывает, как это сделать, используя FOR XML.\


select r.student_id [StudentID],
r.building [Building],
ab.attedancePeriod [Period],
STUFF
    (
        (
            SELECT ',' + convert(varchar(2), grade)
            FROM register
            WHERE register.student_id = r.student_id
            group BY month(student_id)
            order by month(grade)
            FOR XML PATH('')
        ), 1, 1, ''
    ) AS Grades
 from register r
inner join att_bottom ab on ab.student_id = r.student_id
where ab.building = '2'
and ab.attendance_c = 'T'
group by r.student_id



это мое предположение, но без исходных таблиц это трудно понять.

О, возможно, вы захотите попробовать это:

select r.student_id [StudentID],
           r.building [Building],
           (select ab.attendancePeriod + ','
                from att_bottom ab
                where ab.student_id = r.student_id
                and ab.building = '2'
                and ab.attendance_c ='T'
                AND CONVERT(varchar,ab.attendance_date,102) = convert(varchar,getdate(),102)
               FOR XML PATH ('') ) AS PERIOD,
                r.GRADE

               FROM register r
               inner join att_bottom a on a.student_id = r.student_id
               where a.attendance = 'T'


Я думаю, что проблема в том, что вы фильтруете на внутреннем уровне, но не на внешнем уровне. Фильтр на внутреннем уровне может быть удален.


Member 10539656

Спасибо за ваш ответ. Я обновил свой вопрос, основываясь на вашем ответе, и мне было интересно, есть ли у вас какие-либо предложения по извлечению только строк со значениями для периода, а не тех, которые этого не делают (те, которым присвоено нулевое значение).

Christian Graus

выберите r.student_id [StudentID],
r.building [здание],
(выберите ab.attendancePeriod + ','
от att_bottom ab
где ab.student_id = r.student_id
и ab.building = '2'
и ab.attendance_c ='T'
И CONVERT(varchar,ab.attendance_date,102) = convert(varchar,getdate(),102)
И ab.attendancePeriod не является нулевым
ДЛЯ XML PATH (") ) КАК ТОЧКА,
Р.Класс

Из регистра r

Но почему вы превращаете даты в строку, чтобы сравнить их ? Почему нет

и конвертировать(дата, АБ.attendance_date) = преобразовать(дата, функции getdate())

?

Member 10539656

Я пробовал это раньше "и ab.attendancePeriod не нулевой", но это не сработало. Я конвертировал дату, потому что формат даты-2014-01-23 00:00:00.000, но я попробовал ваш путь, и он тоже сработал.

Christian Graus

Мой способ намного эффективнее.

Начните с этого:

Выберите ',' + конвертировать(varchar(2), класс)
из регистра
Где register.student_id = r.student_id
группа по месяцам(student_id)
заказ по месяцам(класс)

замените r.studentid значением, которое, как вы знаете, содержит нули. Тогда экспериментируйте. Действительно, не нуль должен работать.

Рейтинг:
0

Shail Mishra

Вы проверяли этот ?


Jochen Arndt

Как он мог проверить в 2014 году поток SO из 2016 года, не имея машины времени?

Пожалуйста, не отвечайте на старые вопросы. Обычно он будет понижен, как вы, возможно, уже поняли (это был не я).