選択した列を単一のクエリで連結しますか?
-
03-07-2019 - |
質問
これを行うことができることは知っています。前に一度やったことがあるのを見たことがありますが、今までどこでそれをする必要がないかを忘れています。
Employeesというテーブルがあり、さまざまな従業員データがあります(duh)。テーブル内のすべての行の名と姓を選択し、それらすべてをコンマ区切りの文字列に含めるクエリが必要です。
たとえば、次のようなデータの行がいくつかあります(実際にはそれ以上の数ですが、この質問のために2つだけを想定しています)。
FName LName ------- ----- Richard Prescott Jill Sentieri Carol Winger
このフォームで前述のデータを返すことができるselectが必要です:
Richard Prescott, Jill Sentieri, Carol Winger
ご協力ありがとうございます!
解決
合体を使用します。このようなもの:
DECLARE @Names varchar(1000)
SELECT @Names = COALESCE(@Names + ', ', '') + Name
FROM Employees
他のヒント
これは、私が見つけた最も効率的な方法です。 SQL Serverが必要ですが、使用しているように聞こえます。
select stuff((
select ', ' + fName + ' ' + lName
from Employees
order by lName, fName /* Optional */
for xml path('')
), 1, 2, '');
アイデアは、xml path( '')で空のタグ名を使用して、行間で文字列の連結を取得する機能を利用できるということです。 stuff(...、1,2、 '')は、先頭のコンマを削除するだけです。
これは非常に高速です。
それを行う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
これが役立つかもしれません。この質問は以前に聞かれました。 「参加」するSQL Server関数を作成する方法サブクエリから複数の行を単一の区切りフィールドに入れますか?
MySQLを使用している場合、それらはまさにそれを行うGROUP_CONCATと呼ばれる素晴らしい機能を持っています。 http://dev.mysql。 com / doc / refman / 5.0 / en / group-by-functions.html#function_group-concat
これは完璧ではありませんが、ほとんどの方法で実現できます
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