Как разделить запятыми несколько строк, полученных из SQL-запроса - PullRequest
1 голос
/ 12 апреля 2011
Select s.FirstName, glTitle.LookupItem Title
    from ClientStaff cs 
    left outer join Staff s on s.Id = cs.StaffId 
    left outer join StaffTitle st on st.StaffId = s.Id 
    left outer join GeneralLookup glTitle on glTitle.Id = st.glTitleId

Возвращает эти строки:

enter image description here

Как видите, в первом столбце есть все одинаковые строки, поскольку у одного сотрудника может быть несколько названий.

Как объединить все заголовки для каждого сотрудника в значение, разделенное запятыми, чтобы на одного сотрудника была только одна строка?

Ответы [ 6 ]

3 голосов
/ 14 апреля 2011

Это сработало для меня:

;with mycte as
    (select s.FirstName, glTitle.LookupItem Title 
    from ClientStaff cs  
    left outer join Staff s on s.Id = cs.StaffId  
    left outer join StaffTitle st on st.StaffId = s.Id  
    left outer join GeneralLookup glTitle on glTitle.Id = st.glTitleId
    group by FirstName, glTitle.LookupItem)

    SELECT Distinct FirstName, Titles = Replace(Replace(( SELECT title  AS [data()] FROM mycte a

    WHERE a.FirstName = b.FirstName 

    ORDER BY a.title FOR XML PATH  ),'</row>',', '),'<row>','')

    FROM mycte b
    ORDER BY FirstName
1 голос
/ 12 апреля 2011

Я обычно создаю функции SQL и вызываю их из своих запросов. Вы можете создать список значений через запятую, используя множество подходов, см. http://blog.sqlauthority.com/2008/06/04/sql-server-create-a-comma-delimited-list-using-select-clause-from-table-column/, Можно ли разделить запятыми несколько строк в одном столбце? .

В этом случае, если вы создаете функцию, вы можете вызвать ее из своего SQL-запроса. Что-то вроде:

select s.FirstName, dbo.GetAllJobTitlesForStaff(s.Id) AS AllJobTitles
from ClientStaff cs 
left outer join Staff s on s.Id = cs.StaffId 
0 голосов
/ 14 апреля 2011
select
  s.FirstName,
  stuff((select ', '+glTitle.LookupItem
         from StaffTitle as st
           inner join GeneralLookup as glTitle
             on glTitle.Id = st.glTitleId 
         where st.StaffId = s.Id
         for xml path(''), type).value('text()[1]', 'nvarchar(max)'), 1, 2, '') as Title
from Staff as s
0 голосов
/ 12 апреля 2011

Вы можете использовать этот запрос.У меня есть общий шаблон для запросов, подобных этим, который следует этому шаблону.Возможно, вам придется отлаживать это, потому что у меня нет структуры вашей таблицы.Объединяет заголовки в список

DECLARE @List varchar(2000), @otherList varchar(2000),@FirstName varchar(2000),@id varchar(2000)
declare @temp table(
    firstName varchar(128),
    title varchar(4000)
)

DECLARE TitleList CURSOR FAST_FORWARD  FOR
select s.FirstName,  s.Id  
from ClientStaff cs  
left outer join Staff s on s.Id = cs.StaffId
OPEN TitleList
FETCH NEXT FROM TitleList INTO @FirstName,@id
WHILE @@FETCH_STATUS = 0
BEGIN
    select @List = COALESCE(@List + ',', '') + Cast(glTitle.LookupItem As varchar(400))
    from StaffTitle st  
    left outer join GeneralLookup glTitle on glTitle.Id = st.glTitleId 
    where st.StaffId = id

    insert into @temp
    select @FirstName,@List
    set @List = null;
FETCH NEXT FROM TitleList INTO @FirstName,@id
END
CLOSE TitleList
DEALLOCATE TitleList

select * from @temp
0 голосов
/ 12 апреля 2011

Попробуйте что-то вроде:

select s.FirstName, GROUP_CONCAT(glTitle.LookupItem Title, ',')
from ClientStaff cs 
left outer join Staff s on s.Id = cs.StaffId 
left outer join StaffTitle st on st.StaffId = s.Id 
left outer join GeneralLookup glTitle on glTitle.Id = st.glTitleId
GROUP BY s.FirstName

Не могу действительно проверить, так что это сложно, трейл и ошибка, как правило, в конце концов работают. Я бы предложил сгруппировать по уникальному идентификатору.

Надеюсь, это поможет ...

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

Это одна из тех вещей, которые трудно (или невозможно) сделать в стандартном SQL. Многие поставщики расширили SQL для поддержки подобных «сверток»; К сожалению, синтаксис каждого поставщика отличается. Извините, у меня нет примера, пригодного в данный момент. Так какую СУБД вы используете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...