SELECT username FROM Users
を発行すると、次の結果が得られます。
ユーザー名 -------- ポール ジョン メアリー
しかし、本当に必要なのはone rowで、すべての値がコンマで区切られています。
ポール、ジョン、メアリー
どうすればいいですか?
これはあなたのために働くはずです。 SQL 2000までさかのぼってテストしました。
create table #user (username varchar(25))
insert into #user (username) values ('Paul')
insert into #user (username) values ('John')
insert into #user (username) values ('Mary')
declare @tmp varchar(250)
SET @tmp = ''
select @tmp = @tmp + username + ', ' from #user
select SUBSTRING(@tmp, 0, LEN(@tmp))
select
distinct
stuff((
select ',' + u.username
from users u
where u.username = username
order by u.username
for xml path('')
),1,1,'') as userlist
from users
group by username
前にタイプミスがあった、上記の作品
いくつかのアプローチの良いレビュー:
記事のコピー-
CoalesceはT-SQLの文字列連結に対する答えではありません。COALESCE関数を使用してT-SQLで文字列の連結を取得することについて、長年にわたって多くの投稿を見てきました。これは、ここの例の1つです(Readifarian Marc Rideyから借用)。
DECLARE @categories varchar(200)
SET @categories = NULL
SELECT @categories = COALESCE(@categories + ',','') + Name
FROM Production.ProductCategory
SELECT @categories
このクエリは非常に効果的ですが、注意が必要であり、COALESCEの使用を適切に理解する必要があります。 COALESCEはISNULLのバージョンで、3つ以上のパラメーターを使用できます。これは、パラメーターのリストの最初のヌルではないものを返します。したがって、実際には連結とは関係がなく、次のコードはまったく同じです(COALESCEを使用しない場合)。
DECLARE @categories varchar(200)
SET @categories = ''
SELECT @categories = @categories + ',' + Name
FROM Production.ProductCategory
SELECT @categories
しかし、データベースの順序付けられていない性質により、これは信頼できません。 T-SQLに(まだ)連結関数がない理由は、これが要素の順序が重要な集約であるためです。この文字列連結の変数割り当て方法を使用すると、特に部分文字列を特定の順序に配置する場合は特に、返される回答にすべての値が含まれていないことがわかります。私のマシンでは、「、Bikes、Clothing、Components、Accessories」を返すようにしたいときに、「、Accessories」のみを返す次のことを考慮してください。
DECLARE @categories varchar(200)
SET @categories = NULL
SELECT @categories = COALESCE(@categories + ',','') + Name
FROM Production.ProductCategory
ORDER BY LEN(Name)
SELECT @categories
はるかに良いのは、順序を考慮したメソッドを使用することです。このメソッドは、特に文字列の連結を目的としてSQL2005に含まれています-FOR XML PATH( '')
SELECT ',' + Name
FROM Production.ProductCategory
ORDER BY LEN(Name)
FOR XML PATH('')
最近、サブクエリを使用するときにGROUP BYとDISTINCTを比較した投稿で、FOR XML PATH( '')の使用方法を示しました。これを見ると、サブクエリでどのように機能するかがわかります。 「STUFF」関数は、先頭のコンマを削除するためだけにあります。
USE tempdb;
GO
CREATE TABLE t1 (id INT, NAME VARCHAR(MAX));
INSERT t1 values (1,'Jamie');
INSERT t1 values (1,'Joe');
INSERT t1 values (1,'John');
INSERT t1 values (2,'Sai');
INSERT t1 values (2,'Sam');
GO
select
id,
stuff((
select ',' + t.[name]
from t1 t
where t.id = t1.id
order by t.[name]
for xml path('')
),1,1,'') as name_csv
from t1
group by id
;
FOR XML PATHは、サブクエリでORDER BYを使用できる唯一の状況の1つです。もう1つはTOPです。そして、名前のない列とFOR XML PATH( '')を使用すると、XMLタグのない、まっすぐな連結が得られます。これは、文字列がHTMLエンコードされることを意味するため、<文字(など)を含む文字列を連結する場合は、後で修正する必要がありますが、いずれにしても、これは文字列を連結する最良の方法ですSQL Server 2005で。
mwigdahlsの答えに基づいています。ここでグループ化する必要がある場合は、どのように見えるようにするかです
group, csv
'group1', 'paul, john'
'group2', 'mary'
--drop table #user
create table #user (groupName varchar(25), username varchar(25))
insert into #user (groupname, username) values ('apostles', 'Paul')
insert into #user (groupname, username) values ('apostles', 'John')
insert into #user (groupname, username) values ('family','Mary')
select
g1.groupname
, stuff((
select ', ' + g.username
from #user g
where g.groupName = g1.groupname
order by g.username
for xml path('')
),1,2,'') as name_csv
from #user g1
group by g1.groupname
このクエリを使用して、上記のタスクを実行できます。
DECLARE @test NVARCHAR(max)
SELECT @test = COALESCE(@test + ',', '') + field2 FROM #test
SELECT field2 = @test
詳細およびステップごとの説明については、次のリンクを参照してください http://oops-solution.blogspot.com/2011/11/sql-server-convert-table-column-data.html
DECLARE @EmployeeList varchar(100)
SELECT @EmployeeList = COALESCE(@EmployeeList + ', ', '') +
CAST(Emp_UniqueID AS varchar(5))
FROM SalesCallsEmployees
WHERE SalCal_UniqueID = 1
SELECT @EmployeeList
ソース: http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string
SQLiteでは、これは簡単です。 MySQL、MSSql、Orableの同様の実装があると思います
CREATE TABLE Beatles (id integer, name string );
INSERT INTO Beatles VALUES (1, "Paul");
INSERT INTO Beatles VALUES (2, "John");
INSERT INTO Beatles VALUES (3, "Ringo");
INSERT INTO Beatles VALUES (4, "George");
SELECT GROUP_CONCAT(name, ',') FROM Beatles;
stuff()を使用して、行をコンマ区切り値として変換できます
select
EmployeeID,
stuff((
SELECT ',' + FPProjectMaster.GroupName
FROM FPProjectInfo AS t INNER JOIN
FPProjectMaster ON t.ProjectID = FPProjectMaster.ProjectID
WHERE (t.EmployeeID = FPProjectInfo.EmployeeID)
And t.STatusID = 1
ORDER BY t.ProjectID
for xml path('')
),1,1,'') as name_csv
from FPProjectInfo
group by EmployeeID;
この回答を得るための参照を@AlexKuznetsovに感謝します。