SQL Server のグループを連結 [重複]
-
06-09-2019 - |
質問
この質問にはすでに答えがあります:
このようなテーブルがあるとします。
+------------+
| Id | Value |
+------------+
| 1 | 'A' |
|------------|
| 1 | 'B' |
|------------|
| 2 | 'C' |
+------------+
次のような結果セットを取得するにはどうすればよいですか:
+------------+
| Id | Value |
+------------+
| 1 | 'AB' |
|------------|
| 2 | 'C' |
+------------+
MySQL で GROUP_CONCAT を使用するとこれが非常に簡単に実行できることはわかっていますが、MSSQL 2005 で実行できるようにする必要があります。
ありがとう
解決
クリーンで効率的なソリューションのためには、ユーザ定義の集約関数を作成することができます、まさに何でもありません例ではあり必要があります。
その後、(標準クエリプランを持つ)他の集約関数と同じように使用することができます:
他のヒント
これが行います。
SELECT mt.ID,
SUBSTRING((SELECT mt2.Value
FROM MyTable AS mt2
WHERE mt2.ID = mt.ID
ORDER BY mt2.VALUE
FOR XML PATH('')), 3, 2000) AS JoinedValue
FROM MyTable AS mt
頻繁 ここで質問されました.
最も効率的な方法は、FOR XML PATH トリックを使用することです。
これは、考えられる解決策の 1 つとして思いつきました。パフォーマンスについてはわかりませんが、問題を解決するには興味深い方法だと思いました。簡単な状況で動作することをテストしました (NULL を考慮したコードは作成しませんでした)。ご自由にテストして、うまく機能するかどうかを確認してください。
私が使用したテーブルには ID (my_id) が含まれていました。これは実際にはグループ内で一意の列 (grp_id) である可能性があるため、日付列などになる可能性があります。
;WITH CTE AS (
SELECT
T1.my_id,
T1.grp_id,
CAST(T1.my_str AS VARCHAR) AS my_str
FROM
dbo.Test_Group_Concat T1
WHERE NOT EXISTS (SELECT * FROM dbo.Test_Group_Concat T2 WHERE T2.grp_id = T1.grp_id AND T2.my_id < T1.my_id)
UNION ALL
SELECT
T3.my_id,
T3.grp_id,
CAST(CTE.my_str + T3.my_str AS VARCHAR)
FROM
CTE
INNER JOIN dbo.Test_Group_Concat T3 ON
T3.grp_id = CTE.grp_id AND
T3.my_id > CTE.my_id
WHERE
NOT EXISTS (SELECT * FROM dbo.Test_Group_Concat T4 WHERE
T4.grp_id = CTE.grp_id AND
T4.my_id > CTE.my_id AND
T4.my_id < T3.my_id)
)
SELECT
CTE.grp_id,
CTE.my_str
FROM
CTE
INNER JOIN (SELECT grp_id, MAX(my_id) AS my_id FROM CTE GROUP BY grp_id) SQ ON
SQ.grp_id = CTE.grp_id AND
SQ.my_id = CTE.my_id
ORDER BY
CTE.grp_id
所属していません StackOverflow