1

Утро Все,SQL CONCAT IF Statement?

Im не уверен, как я должен решить мой следующий запрос ... У меня есть следующий запрос, который отъезжает нужные записи в сервере SQL ...

SELECT agenda.AgendaItemNumber,Agenda.AgendaName, AgendaType.AgendaTypeDescription, userdetails.fullName 
FROM Agenda 
JOIN AgendaType ON AgendaType.AgendaTypeID=Agenda.AgendaTypeID 
JOIN UserDetails ON Agenda.AgendaID = Userdetails.AgendaID 
WHERE agenda.AgendaTypeID = '2' 
AND AgendaItemNumber = AgendaItemNumber 
AND AgendaName = AgendaName 
AND AgendaTypeDescription = AgendaTypeDescription 
AND AgendaItemNumber >= '3' 

выше запрос работает, но мне нужно немного улучшить это. Он отодвигается следующие результаты, которые по существу являются повторяющиеся записи для столбца «FULLNAME», за исключением ...

Results_image

Что я хотел бы сделать, это быть в состоянии добавить дополнительный код для этого запроса, так что когда я запускаю запрос, я могу отображать по одной записи для каждого «AgendaItemNumber» и для того, чтобы согласовать оба полных имени для этой записи. Тем не менее, у меня есть дополнительная таблица AgendaItemsNumbers в этой таблице, которая имеет только одно имя пользователя x x, присвоенное им. его всего лишь несколько записей в файле изображений, которые мне нужно делать с умными.

Возможно, есть лучший способ выполнить эту задачу?

Большое спасибо заранее. Любые вопросы, пожалуйста, не стесняйтесь спрашивать.

С уважением Бетти

+1

"И AgendaItemNumber = AgendaItemNumber ...". Хм, почему? – adelphus

+0

** И AgendaItemNumber = AgendaItemNumber AND AgendaName = AgendaName AND AgendaTypeDescription = AgendaTypeDescription ** не имеет смысла. Также используйте ** INNER JOIN ** – Kaf

ответ

4
SELECT agenda.AgendaItemNumber, 
     Agenda.AgendaName, 
     AgendaType.AgendaTypeDescription, 
     STUFF((SELECT ';' + FullName 
       FROM UserDetails 
       WHERE UserDetails.AgendaID = Agenda.AgendaID 
       FOR XML PATH('') 
      ), 1, 1, '') AS fullName 
FROM Agenda 
     INNER JOIN AgendaType 
      ON AgendaType.AgendaTypeID=Agenda.AgendaTypeID 
     INNER JOIN UserDetails 
      ON Agenda.AgendaID = Userdetails.AgendaID 
WHERE agenda.AgendaTypeID = '2' 
AND  AgendaItemNumber = AgendaItemNumber 
AND  AgendaName = AgendaName 
AND  AgendaTypeDescription = AgendaTypeDescription 
AND  AgendaItemNumber >= '3' 

ADENDUM

Расширение XML в SQL-сервер позволяет объединить несколько строк в одну строку. Фактическое намерение расширения заключается в том, что вы можете выводить как XML (очевидно), но есть некоторые изящные трюки, которые являются побочными продуктами расширений. В приведенном выше запросе, если в подзапросе (FullName) было имя столбца, оно будет выводиться как <FullName>Joe Bloggs1</FullName><FullName>Joe Bloggs2</FullName>, потому что нет имени столбца, он просто объединяет строки (не образуя надлежащий XML). Часть PATH позволяет указать дополнительный узел, например, если вы используете PATH ('Name') в приведенном выше примере, вы получите <Name>;Joe Bloggs</Name><Name>;Joe Bloggs2</Name>. Если вы комбинируете Path с именем столбца, вы получите Joe Bloggs.

Наконец STUFF просто удаляет точку с запятой в начале списка.

+0

@GarethD Большое спасибо за вышеупомянутый запрос. Это мешает работать. Могу я просто спросить, что делает XML-путь? Является, по сути, частью запроса CONCAT для столбца FullName. Не слишком уверен в том, что делает ...., 1,1 '') часть запроса. Однако это делает трюк. Большое спасибо. – Betty

+0

@adelphus Пояснение добавлено. – GarethD

+0

@Betty 'STUFF (.. 1, 1, '')' Part просто удаляет первую точку с запятой, чтобы вы получили «Name1; Name2» вместо «; Name1; Name2». Вы могли бы просто использовать «FullName +»; »и полностью удалить« STUFF », чтобы получить список вроде« Name1; Name2; » – GarethD