T-SQL には文字列を連結する集計関数がありますか? [重複] 質問する

T-SQL には文字列を連結する集計関数がありますか? [重複] 質問する

重複の可能性があるもの:
SQL Server 2000 に Implode 型関数はありますか?
T-SQL 内の複数のレコードのフィールドを別のフィールドでグループ化するにはどうすればよいですか?

次のようなビューをクエリしています。

BuildingName    PollNumber
------------    ----------
Foo Centre      12        
Foo Centre      13
Foo Centre      14
Bar Hall        15
Bar Hall        16
Baz School      17

次のように、BuildingNames をグループ化し、PollNumbers のリストを表示するクエリを作成する必要があります。

BuildingName    PollNumbers
------------    -----------
Foo Centre      12, 13, 14
Bar Hall        15, 16
Baz School      17

これを T-SQL で実行するにはどうすればよいですか? これを行うためにストアド プロシージャを記述するのはやりすぎのように思えるので避けたいのですが、私はデータベースに詳しいわけではありません。SUM() や AVG() などの集計関数が必要なようですが、T-SQL にそのような関数があるかどうかはわかりません。SQL Server 2005 を使用しています。

ベストアンサー1

SQL Server 2017 以降の場合は以下を使用します。

STRING_AGG()

set nocount on;
declare @YourTable table (RowID int, HeaderValue int, ChildValue varchar(5))
insert into @YourTable VALUES (1,1,'CCC')
insert into @YourTable VALUES (2,2,'B<&>B')
insert into @YourTable VALUES (3,2,'AAA')
insert into @YourTable VALUES (4,3,'<br>')
insert into @YourTable VALUES (5,3,'A & Z')
set nocount off
SELECT
    t1.HeaderValue
        ,STUFF(
                   (SELECT
                        ', ' + t2.ChildValue
                        FROM @YourTable t2
                        WHERE t1.HeaderValue=t2.HeaderValue
                        ORDER BY t2.ChildValue
                        FOR XML PATH(''), TYPE
                   ).value('.','varchar(max)')
                   ,1,2, ''
              ) AS ChildValues
    FROM @YourTable t1
    GROUP BY t1.HeaderValue

SELECT
    HeaderValue, STRING_AGG(ChildValue,', ')
    FROM @YourTable
    GROUP BY HeaderValue

出力:

HeaderValue 
----------- -------------
1           CCC
2           B<&>B, AAA
3           <br>, A & Z

(3 rows affected)

SQL Server 2005 および 2016 までの場合は、次のようにする必要があります。

--Concatenation with FOR XML and eleminating control/encoded character expansion "& < >"
set nocount on;
declare @YourTable table (RowID int, HeaderValue int, ChildValue varchar(5))
insert into @YourTable VALUES (1,1,'CCC')
insert into @YourTable VALUES (2,2,'B<&>B')
insert into @YourTable VALUES (3,2,'AAA')
insert into @YourTable VALUES (4,3,'<br>')
insert into @YourTable VALUES (5,3,'A & Z')
set nocount off
SELECT
    t1.HeaderValue
        ,STUFF(
                   (SELECT
                        ', ' + t2.ChildValue
                        FROM @YourTable t2
                        WHERE t1.HeaderValue=t2.HeaderValue
                        ORDER BY t2.ChildValue
                        FOR XML PATH(''), TYPE
                   ).value('.','varchar(max)')
                   ,1,2, ''
              ) AS ChildValues
    FROM @YourTable t1
    GROUP BY t1.HeaderValue

出力:

HeaderValue ChildValues
----------- -------------------
1           CCC
2           AAA, B<&>B
3           <br>, A & Z

(3 row(s) affected)

FOR XML PATHまた、すべての連結が上記の例のように XML 特殊文字を適切に処理するわけではないので注意してください。

おすすめ記事