10

私がこのようなテーブルを持っている場合:

+------------+
| Id | Value |
+------------+
| 1  | 'A'   |
|------------|
| 1  | 'B'   |
|------------|
| 2  | 'C'   |
+------------+

次のような結果セットを取得するにはどうすればよいですか。

+------------+
| Id | Value |
+------------+
| 1  | 'AB'  |
|------------|
| 2  | 'C'   |
+------------+

これは、MySQLでGROUP_CONCATを使用して非常に簡単に実行できることを知っていますが、MSSQL2005で実行できる必要があります。

ありがとう

(SQLServerで文字列を連結するためにGROUPBYを使用する方法の重複?

4

5 に答える 5

11

クリーンで効率的なソリューションとして、ユーザー定義の集計関数を作成できます。必要なことだけを実行する例もあります。
その後、他の集計関数と同じように使用できます(標準のクエリプランを使用)。

クエリプラン

于 2009-12-17T15:31:39.490 に答える
5

これは行います:

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
于 2009-06-02T18:29:10.233 に答える
4

見る:

http://blog.shlomoid.com/2008/11/emulating-mysqls-groupconcat-function.html

于 2009-06-02T18:27:07.990 に答える
3

ここでよく聞かれます

最も効率的な方法は、FORXMLPATHトリックを使用することです。

于 2009-06-02T18:28:32.513 に答える
1

これは、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
于 2009-06-02T18:49:56.543 に答える