99

発行SELECT username FROM Usersすると、次の結果が得られます。

ユーザー名
--------
ポール
ジョン
メアリー

しかし、私が本当に必要としているのは、次のように、すべての値がコンマで区切られた1つの行です。

ポール、ジョン、メアリー

どうすればよいですか?

4

10 に答える 10

133
 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

以前にタイプミスがあった、上記の作品

于 2009-11-23T21:00:06.630 に答える
111

これはあなたのために働くはずです。SQL2000までさかのぼってテストしました。

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))
于 2009-05-20T12:44:50.727 に答える
57

いくつかのアプローチの良いレビュー:

http://blogs.msmvps.com/robfarley/2007/04/07/coalesce-is-not-the-answer-to-string-concatentation-in-t-sql/

記事のコピー-

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は、3つ以上のパラメーターを取ることができるISNULLのバージョンです。nullではないパラメータのリストの最初のものを返します。したがって、実際には連結とは何の関係もありません。次のコードは、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は、サブクエリでORDERBYを使用できる唯一の状況の1つです。もう1つはTOPです。また、名前のない列とFOR XML PATH('')を使用すると、XMLタグのないまっすぐな連結が得られます。これは、文字列がHTMLエンコードされることを意味するため、<文字(など)を含む可能性のある文字列を連結する場合は、後で修正する必要がありますが、いずれにしても、これは文字列を連結するための最良の方法です。 SQLServer2005で。

于 2009-05-20T16:06:29.697 に答える
12

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
于 2015-07-17T14:56:40.943 に答える
8

このクエリを使用して、上記のタスクを実行できます。

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

于 2011-11-04T11:54:28.687 に答える
7
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

于 2011-01-12T18:50:03.150 に答える
6

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;
于 2012-02-13T07:41:19.740 に答える
4

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に感謝します。

于 2014-05-30T10:44:41.290 に答える
3

MS SQL Server 2005/2008のクリーンで柔軟なソリューションは、CLRAgregate関数を作成することです。

あなたはグーグルでかなりの数の記事(コード付き)を見つけるでしょう。

この記事では、C#を使用したプロセス全体について説明しているようです。

于 2009-05-20T19:15:54.900 に答える
-5

PHPを介してこれを実行している場合、これはどうですか?

$hQuery = mysql_query("SELECT * FROM users");
while($hRow = mysql_fetch_array($hQuery)) {
    $hOut .= $hRow['username'] . ", ";
}
$hOut = substr($hOut, 0, strlen($hOut) - 1);
echo $hOut;
于 2009-05-20T12:49:24.120 に答える