web-dev-qa-db-ja.com

SQL Server 2005で複数の行をコンマ区切りリストに結合するにはどうすればよいですか?

現在、次のようなSQLクエリがあります。

SELECT X, Y FROM POINTS

次のような結果を返します。

X    Y
----------
12   3
15   2
18   12
20   29

次のように、結果をすべて1行で返します(HTML <AREA>タグでの使用に適しています):

XYLIST
----------
12,3,15,2,18,12,20,29

SQLだけを使用してこれを行う方法はありますか?

43
Joshua Carmody
DECLARE @XYList varchar(MAX)
SET @XYList = ''

SELECT @XYList = @XYList + CONVERT(varchar, X) + ',' + CONVERT(varchar, Y) + ','
FROM POINTS

-- Remove last comma
SELECT LEFT(@XYList, LEN(@XYList) - 1)
26
Ben Hoffstein

迅速で役立つ回答をありがとうございます!

私はこれを行う別の高速な方法を見つけました:

SELECT  STUFF(( SELECT ',' + X + ',' + Y
                FROM Points
              FOR
                XML PATH('')
              ), 1, 1, '') AS XYList

この男の功績は次のとおりです。

http://geekswithblogs.net/mnf/archive/2007/10/02/t-sql-user-defined-function-to-concatenate-column-to-csv-string.aspx

73
Joshua Carmody

COALESCEトリックを使用すると、末尾のコンマについて心配する必要はありません。

DECLARE @XYList AS varchar(MAX) -- Leave as NULL

SELECT @XYList = COALESCE(@XYList + ',', '') + CONVERT(varchar, X) + ',' + CONVERT(varchar, Y)
FROM POINTS
12
Cade Roux

SQL 2017以降では、STRING_AGGを使用できます

SELECT STRING_AGG (X + ',' + Y, ',') AS XYLIST
FROM POINTS

https://docs.Microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017

6
Carter Medlin
DECLARE @s VarChar(8000)
SET @s = ''

SELECT @s = @s + ',' + CAST(X AS VarChar) + ',' + CAST(Y AS VarChar) 
FROM POINTS

SELECT @s 

先頭のコンマを取り除くだけです

1
Peter