У меня есть оператор SQL FOR XML, в котором я преобразую текст для использования в списке через запятую в функции STUFF.Мы перечисляем степени, полученные студентами в университете.В таблице, из которой взяты данные, указано полное название школы, в которой учился учащийся, и год выпуска из четырех цифр.Я трансформирую таблицу, чтобы представить код школы и двузначный сокращенный год обучения с апострофом.Это входит в список XML, так что выпускники с несколькими степенями могут иметь все свои степени в списке вместе.Например, следующее:
College of Arts & Sciences, 1999
Law School, 2001
Graduate School, 2006
Становится так для использования в тегах имен событий:
A&S '99, Law '01, Grad '06
Я считаю, что наши таблицы имеют дублирование для некоторых степеней.Например, один список может отображаться как:
A&S '99, A&S '99, Grad '05
Я хочу устранить такое дублирование.Тем не менее, мне нужно сохранить текст в формате, как показано.Мне также нужно сохранить степени в порядке, в котором они были заработаны.
Я попытался сделать свой оператор SELECT в моей функции STUFF DISTINCT.Однако, поскольку мне нужно отсортировать по полю [PREFERREDCLASSYEAR], которое на самом деле не содержится в выводимых данных, я получаю сообщение об ошибке: «Элементы ORDER BY должны появляться в списке выбора, если указано SELECT DISTINCT».Тем не менее, я не могу иметь полный предпочтительный учебный год в списке и сохранить форматирование по желанию.Я также не могу просто отсортировать результаты, так как значение сортировки не обязательно определяется значением, включенным в эти результаты.
Я также попытался сгруппировать либо (пере) переведенные результаты, либо поля ввода, но безуспешно.Я также попытался использовать временную таблицу, которая просто выдает множество ошибок.
Этот оператор создает дублированные градусы и годы:
stuff((select iif([PREFERREDCLASSYEAR]=0, '',', ' +
(case
when [EDUCATIONALPROGRAM] = 'College of Arts & Sciences' then 'Arts'
when [EDUCATIONALPROGRAM] = 'College of Business Administration' then 'Bus Ad'
end) + ' ''' + right(cast([PREFERREDCLASSYEAR] as nvarchar),2))
from [dbo].[V_QUERY_EDUCATIONALHISTORY] as [CollegeTable]
where [V_QUERY_REGISTRANT\Constituent].[ID] = [CollegeTable].[CONSTITUENTID]
order by [PREFERREDCLASSYEAR] asc
for XML path ('')),1,2,'') as [DegreeHistoryShort],
Этот оператор дает мне сообщение «ORDER BY элементы должны появиться в списке выбора, если SELECT DISTINCT указан».
stuff((select distinct iif([PREFERREDCLASSYEAR]=0, '',', ' +
(case
when [EDUCATIONALPROGRAM] = 'College of Arts & Sciences' then 'Arts'
when [EDUCATIONALPROGRAM] = 'College of Business Administration' then 'Bus Ad'
end) + ' ''' + right(cast([PREFERREDCLASSYEAR] as nvarchar),2))
from [dbo].[V_QUERY_EDUCATIONALHISTORY] as [CollegeTable]
where [V_QUERY_REGISTRANT\Constituent].[ID] = [CollegeTable].[CONSTITUENTID]
order by [PREFERREDCLASSYEAR] asc
for XML path ('')),1,2,'') as [DegreeHistoryShort],
Этот оператор генерирует множество синтаксических ошибок практически со всеми командами в таблице (пытаясь использовать выбор вокруг выбора).
stuff(select distinct * from (select iif([PREFERREDCLASSYEAR]=0, '',
(case
when [EDUCATIONALPROGRAM] = 'College of Arts & Sciences' then 'Arts'
when [EDUCATIONALPROGRAM] = 'College of Business Administration' then 'Bus Ad'
end) + ' ''' + right(cast([PREFERREDCLASSYEAR] as nvarchar),2))
from [dbo].[V_QUERY_EDUCATIONALHISTORY] as [CollegeTable]
where [V_QUERY_REGISTRANT\Constituent].[ID] = [CollegeTable].[CONSTITUENTID]
order by [PREFERREDCLASSYEAR] asc)
for XML path ('')),1,2,'') as [DegreeHistoryShort],
Я либо застрял сдублирование или необходимость каким-либо образом включать полный учебный год, который я не могу включить.