[解決済み] 文字列の連結/集約の最適な方法
質問
異なる行から1つの行に文字列を集約する方法を探しています。私はこれを多くの異なる場所で行いたいので、これを容易にするための関数があるとよいでしょう。私は、以下のものを使用するソリューションを試しました。
COALESCE
と
FOR XML
などがありますが、私には合いません。
文字列集計はこんな感じでしょうか。
id | Name Result: id | Names
-- - ---- -- - -----
1 | Matt 1 | Matt, Rocks
1 | Rocks 2 | Stylus
2 | Stylus
を見てみると
CLRで定義された集計関数
の代わりとして
COALESCE
と
FOR XML
が、どうやら
SQL Azure
ではありません。
をサポートしないので、それを使えるようになれば多くの問題を解決できるのにと思います。
可能な回避策、または同様に最適な方法 (CLR ほど最適ではないかもしれませんが) はありますでしょうか。 ね
もらえるものはもらっておきます)、私のものを集約するために使用できるものはありますか?どのように解決するのですか?
解決方法
の定義は 最適 の定義は様々ですが、ここでは通常の Transact SQL を使って異なる行の文字列を連結する方法を示します。これは Azure でも問題なく動作するはずです。
;WITH Partitioned AS
(
SELECT
ID,
Name,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) AS NameNumber,
COUNT(*) OVER (PARTITION BY ID) AS NameCount
FROM dbo.SourceTable
),
Concatenated AS
(
SELECT
ID,
CAST(Name AS nvarchar) AS FullName,
Name,
NameNumber,
NameCount
FROM Partitioned
WHERE NameNumber = 1
UNION ALL
SELECT
P.ID,
CAST(C.FullName + ', ' + P.Name AS nvarchar),
P.Name,
P.NameNumber,
P.NameCount
FROM Partitioned AS P
INNER JOIN Concatenated AS C
ON P.ID = C.ID
AND P.NameNumber = C.NameNumber + 1
)
SELECT
ID,
FullName
FROM Concatenated
WHERE NameNumber = NameCount
説明
アプローチは3つのステップに集約されます。
-
行に番号を付けるには
OVER
とPARTITION
をグループ化し、連結のために必要な順序に並べます。その結果Partitioned
CTEです。後で結果をフィルタリングするために、各パーティション内の行のカウントを保持しています。 -
再帰的なCTEを使用し (
Concatenated
) を使って、行番号の間を繰り返し処理します (NameNumber
列) を追加します。Name
に値を追加する。FullName
カラムに追加します。 -
を除くすべての結果をフィルタリングして、最も高い
NameNumber
.
このクエリを予測可能にするためには、グループ化の両方を定義する必要があることに留意してください (たとえば、あなたのシナリオでは、同じ
ID
を持つ行は連結される) とソート (連結の前に単純にアルファベット順にソートしていると仮定) の両方を定義しなければならないことに留意してください。
早速、SQL Server 2012で以下のデータで解決策をテストしてみました。
INSERT dbo.SourceTable (ID, Name)
VALUES
(1, 'Matt'),
(1, 'Rocks'),
(2, 'Stylus'),
(3, 'Foo'),
(3, 'Bar'),
(3, 'Baz')
クエリの結果です。
ID FullName
----------- ------------------------------
2 Stylus
3 Bar, Baz, Foo
1 Matt, Rocks
関連
-
[解決済み] [GROUP BY句に含まれるか、集約関数で使用される必要があります。
-
MHAの高可用性構成とフェイルオーバー
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] SQL Server - 挿入された行のIDを取得するための最良の方法は?
-
[解決済み] Entity Frameworkにおける最速の挿入方法
-
[解決済み] SQL Serverで結果をページ分割する最も良い方法は何ですか?
-
[解決済み] SQL ServerでGROUP BYを使って文字列を連結する方法とは?
-
[解決済み] PostgreSQL の 'group by' クエリで、文字列フィールドの文字列を連結する方法は?
-
[解決済み] MySQLでGROUP BYを使って文字列を連結する方法とは?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
ERROR 1136 (21S01) を解決してください。列の数が Mysql の行 1 の値の数と一致しません。
-
windows mysql prompt access denied for user ''@'localhost' to database.
-
[解決済み] ストアドプロシージャ 'dbo.aspnet_CheckSchemaVersion' が見つかりませんでした。
-
[解決済み] データベースのインデックス作成はどのように行われるのですか?[クローズド]
-
[解決済み] PostgreSQLからのPL/pgSQL出力をCSVファイルに保存する
-
[解決済み] T-SQLでnot equalには!=と<>のどちらを使うべきですか?
-
[解決済み] 項目xにアクセスできるように文字列を分割するにはどうすればよいですか?
-
[解決済み] SQLのインデックスとは何ですか?
-
[解決済み] SQL/mysql - Select distinct/UNIQUE but return all column?
-
[解決済み] VARCHARとCHARの違いは何ですか?