C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

集約して取得する方法

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■96895 / inTopicNo.1)  集約して取得する方法
  
□投稿者/ くれんけ (1回)-(2021/02/24(Wed) 16:07:03)

分類:[データベース全般] 

2021/02/24(Wed) 16:12:32 編集(投稿者)


SQLServer2012 を使用しています。


1, 'A'
1, 'B'
1, 'C'
1, 'D'
2, 'E'
2, 'F'
2, 'G'

以下のデータをとる方法を教えてください

ID, NAMES
1, 'A,B,C,D'
1, 'E,F,G'</pre></pre>
引用返信 編集キー/
■96896 / inTopicNo.2)  Re[1]: 集約して取得する方法
□投稿者/ 魔界の仮面弁士 (2975回)-(2021/02/24(Wed) 16:42:07)
2021/02/24(Wed) 16:45:43 編集(投稿者)

No96895 (くれんけ さん) に返信
> 以下のデータをとる方法を教えてください
> ID, NAMES
> 1, 'A,B,C,D'
> 1, 'E,F,G'

「1, 'E,F,G'」ではなく
「2, 'E,F,G'」ですよね?


手っ取りばやく STRING_AGG を使いたい所ですが、
今回は SQL Server のバージョンが古いので、
FOR XML PATH を使うことになるかな。


CREATE TABLE [TBL] ([ID] INT NOT NULL, [NAME] NVARCHAR(10) NOT NULL);

INSERT INTO [TBL] ([ID], [NAME]) VALUES
(1, N'A'),
(1, N'B'),
(1, N'C'),
(1, N'D'),
(2, N'E'),
(2, N'F'),
(2, N'G');


/* 案1: STRING_AGG を使う方法。要 SQL Server 2017 以上 */

SELECT [ID], [NAMES] = STRING_AGG([NAME], ',')
FROM [TBL]
GROUP BY [ID]
ORDER BY [ID]
;


/* 案2: FOR XML PATH を用いる方法 */

WITH [A] AS (
SELECT DISTINCT
[B].[ID], [NAMES]=(
SELECT [C].[NAME] + N','
FROM [TBL] [C]
WHERE [B].[ID] = [C].[ID]
ORDER BY [C].[NAME]
FOR XML PATH('')
) FROM [TBL] [B]
) SELECT [ID], [NAMES]
=STUFF([NAMES], LEN([NAMES]), LEN([NAMES]), '')
FROM [A] ORDER BY [ID]
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ