Нужны результаты DISTINCT внутри оператора FOR XML, но необходимо отсортировать данные, не включенные в FOR XML - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть оператор 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],

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

1 Ответ

0 голосов
/ 12 апреля 2019

Неважно. Я понял это сам. Сначала сгруппируйте оба поля с помощью [PREFERREDCLASSYEAR].

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]
     group by [PREFERREDCLASSYEAR],[EDUCATIONALPROGRAM]
     order by [PREFERREDCLASSYEAR],[EDUCATIONALPROGRAM] asc
     for XML path ('')),1,2,'') as [DegreeHistoryShort],
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...