Объединить выбранный столбец в одном запросе? - PullRequest
1 голос
/ 30 апреля 2009

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

У меня есть таблица, которая называется Employees, и в ней есть различные данные о сотрудниках (duh). Мне нужен запрос, который сделает выбор по имени и фамилии всех строк в таблице, а затем объединит их все в строку с разделителями-запятыми.

Например, у меня есть несколько строк (намного больше, чем на самом деле, но ради этого вопроса просто предположим две) данных, которые выглядят так:

FName    LName
-------  -----
Richard  Prescott
Jill     Sentieri
Carol    Winger

Мне нужно выбрать, который может вернуть вышеупомянутые данные в этой форме:

Richard Prescott, Jill Sentieri, Carol Winger

Заранее благодарю за помощь!

Ответы [ 6 ]

7 голосов
/ 30 апреля 2009

Используйте коалесцию. Примерно так:

DECLARE @Names varchar(1000)
SELECT @Names = COALESCE(@Names + ', ', '') + Name
FROM Employees
2 голосов
/ 01 мая 2009

Это самый эффективный метод, который я нашел. Для этого требуется SQL Server, но, похоже, это то, что вы используете.

select stuff((
    select ', ' + fName + ' ' + lName
    from Employees
    order by lName, fName /* Optional */
    for xml path('')
), 1, 2, '');

Идея состоит в том, что вы можете воспользоваться возможностью использовать пустое имя тега для пути xml (''), чтобы получить конкатенацию строк между строками. Материал (..., 1,2, '') просто удаляет начальную запятую.

Это действительно быстро.

1 голос
/ 30 апреля 2009

вы можете написать UDF для этого

CREATE FUNCTION [dbo].[fnc_GetEmpList](
@CompId numeric
) RETURNS nvarchar(1000)
BEGIN

declare @str nvarchar(1000)
set @str =''

select  @str = @str + ',' + FirstName + ' ' + LastName from Employees


--remove the last comma
if(@str<>'')
    set @str = right(@str,len(@str)-1)

return @str


END
0 голосов
/ 30 апреля 2009

это не идеально, но вы получите большую часть пути туда

declare @count int
declare @i int
declare @string nvarchar(max)
declare @name nvarchar(100)

declare @Employees (EmpName nvarchar(100), ID int identity(1,1)

insert into @Employees (EmpName)
select FirstName + ' ' + LastName
from Employees


select @count=count(*) from @Employees
set @i=1
set @string=''


while (@i<=@count)
begin

    select @name = EmpName from @Employees where ID=@i

    set @string = @string + ',' + @name

    set @i=@i+1
end
0 голосов
/ 30 апреля 2009

Если вы используете MySQL, у них есть замечательная функция GROUP_CONCAT, которая делает именно это. http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

0 голосов
/ 30 апреля 2009
...