[解決済み] T-SQLには、文字列を連結するための集約関数がありますか?重複
2023-06-09 04:28:18
質問
重複の可能性があります。
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を使用しています。
どのように解決するのですか?
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
OUTPUTです。
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
OUTPUTです。
HeaderValue ChildValues
----------- -------------------
1 CCC
2 AAA, B<&>B
3 <br>, A & Z
(3 row(s) affected)
また、気をつけなければならないのは、すべての
FOR XML PATH
の連結が、上記の例のようにXMLの特殊文字を適切に処理するわけではないことに注意してください。
関連
-
[解決済み] [GROUP BY句に含まれるか、集約関数で使用される必要があります。
-
[解決済み] SQL Server の更新コマンドでエラー - "現在のコマンドで深刻なエラーが発生しました".
-
[解決済み] SQL ServerでRegExを使用する
-
[解決済み] SQL Serverでマテリアライズド・ビューを作成する方法は?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Serverにおける関数とストアドプロシージャの比較
-
[解決済み] SQL ServerでGROUP BYを使って文字列を連結する方法とは?
-
[解決済み】SQL Serverスキーマは何の役に立つのか?
-
[解決済み】SQL Serverで中央値を計算する関数
-
[解決済み] 文字列の連結/集約の最適な方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SQL Serverで小数点の後に2桁の数字を表示させる方法
-
[解決済み] TABLOCKとTABLOCKXの比較
-
[解決済み] sp_columnsが結果を返さないのはなぜですか?
-
[解決済み] テーブルが存在しない場合、"Table 'dbo.Foo' already exists." というエラーはどのように解決すればよいですか?
-
[解決済み] 変数に値を代入するSELECT文は、データ検索操作と組み合わせてはいけません。
-
[解決済み] 監査失敗、クレデンシャル検証 4776
-
[解決済み] 文字列から特定の文字を削除する
-
[解決済み] 条件付きJOINステートメント SQL Server
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL ServerでGROUP BYを使って文字列を連結する方法とは?