以下に、2 つのテーブルと結果テーブルを示します。
上記のように、この方法で結果テーブルを取得するにはどうすればよいですか?
select min(ID) as ID,
Val,
stuff((select ','+Cat
from Table2 as T2
where T1.Val = T2.Val
for xml path(''), type).value('.', 'nvarchar(max)'), 1, 1, '') as Cat
from Table2 as T1
group by Val
order by ID
DECLARE @Table1 TABLE
(
id INT
,Val VARCHAR(100)
)
DECLARE @Table2 TABLE
(
id INT
,Val VARCHAR(100)
,Cat VARCHAR(100)
)
INSERT INTO @Table1
VALUES(1,'XYZ')
INSERT INTO @Table1
VALUES(2,'abc')
INSERT INTO @Table2
VALUES(1,'XYZ','a')
INSERT INTO @Table2
VALUES(1,'abc','e')
INSERT INTO @Table2
VALUES(1,'XYZ','b')
INSERT INTO @Table2
VALUES(1,'XYZ','f')
INSERT INTO @Table2
VALUES(1,'abc','g')
SELECT t1.id,t1.Val ,( SELECT STUFF((SELECT ',' + cat FROM @Table2 t2 WHERE t2.Val = t1.val FOR XML PATH('')),1,1,''))
FROM @Table1 t1
それを行うために、CLR ユーザー定義集計を定義できます。このようなソリューションの詳細な説明を別の質問への回答として投稿しました - TSQL Comma Separation。そこには、CLR 集計の開発中に発生する可能性のある問題について説明しているブログ投稿へのリンクもあります。
カスタム集計をサーバーにデプロイした後 (関数に名前を付けましたConcat
が、関数の名前は異なる場合があります)、次のクエリで必要な結果を取得できます。
SELECT Val, dbo.Concat(Cat)
FROM Table2
GROUP BY Val