需要帮助根据 GROUP BY 将多行分组为单个字符串吗?

Need help grouping multiple rows into single string based on GROUP BY?

以前可能有人问过这个问题,但我一直在进行一些挖掘,但找不到任何类似的问题。提前致谢

编辑:完全忘记了。我们使用 SQL 2005(否则我可能只使用 GROUP_CONCAT)

样本Table:

ID  CATEGORY    ATTRIBUTE
1   A   Piano
1   A   Saxophone
1   B   Jazz
1   C   Mellow
1   C   Pensive
2   A   Drums
2   A   Guitar
2   B   Rock
2   B   Classics
2   C   Upbeat
2   C   High Energy

期望的输出:

ID  CATEGORY    ATTRIBUTE
1   A   Piano, Saxophone
1   B   Jazz
1   C   Mellow, Pensive
2   A   Drums, Guitar
2   B   Rock, Classics
2   C   Upbeat, High Energy

使用GROUP_CONCAT()

SELECT ID,CATEGORY,GROUP_CONCAT(ATTRIBUTE)
FROM TABLENAME
GROUP BY ID,CATEGORY

FOR MS SQL 使用此语法

SELECT table_name, LEFT(column_names , LEN(column_names )-1) AS column_names
FROM information_schema.columns AS extern
CROSS APPLY
(
    SELECT column_name + ','
    FROM information_schema.columns AS intern
    WHERE extern.table_name = intern.table_name
    FOR XML PATH('')
) pre_trimmed (column_names)
GROUP BY table_name, column_names;

试试这个

SELECT ID,
        CATEGORY,
        ATTRIBUTE1
 FROM TABLENAME TB
 cross apply 
   (SELECT TB1.ATTRIBUTE + ', '
    FROM TABLENAME TB1
    WHERE TB1.ID = TB.ID  For XML PATH(''))A1 (ATTRIBUTE1)
GROUP BY TB.ID,TB.CATEGORY

使用 XML PATH 的标准旧式嵌套查询应该适用于 SQL 2005。

DECLARE @TableName TABLE
(
     ID         INT
    ,CATEGORY   NVARCHAR(5)
    ,ATTRIBUTE  NVARCHAR(50)
    ,PRIMARY KEY(ID, CATEGORY, ATTRIBUTE)
)

INSERT INTO @TableName
(
     ID         
    ,CATEGORY
    ,ATTRIBUTE
)
VALUES
    (1   ,'A'   ,'Piano'            ),
    (1   ,'A'   ,'Saxophone'        ),
    (1   ,'B'   ,'Jazz'             ),
    (1   ,'C'   ,'Mellow'           ),
    (1   ,'C'   ,'Pensive'          ),
    (2   ,'A'   ,'Drums'            ),
    (2   ,'A'   ,'Guitar'           ),
    (2   ,'B'   ,'Rock'             ),
    (2   ,'B'   ,'Classics'         ),
    (2   ,'C'   ,'Upbeat'           ),
    (2   ,'C'   ,'High Energy'      );


WITH CTE_Concatenate 
AS
(
    SELECT  ID
            ,CATEGORY
            ,(
                SELECT ATTRIBUTE + ','
                FROM @TableName [Inner]
                WHERE [Outer].ID = [Inner].ID AND [Outer].CATEGORY = [Inner].CATEGORY
                FOR XML PATH('')
             ) AS ATTRIBUTES
    FROM    @TableName [Outer]
    GROUP BY    ID, CATEGORY
)
SELECT  ID
        ,CATEGORY
        ,LEFT(ATTRIBUTES, LEN(ATTRIBUTES) - 1) AS ATTRIBUTES
FROM    CTE_Concatenate;

可以使用 STUFF 函数进一步简化查询,如下所示:

SELECT  ID
        ,CATEGORY
        ,STUFF( (
            SELECT ',' + ATTRIBUTE 
            FROM @TableName [Inner]
            WHERE [Outer].ID = [Inner].ID AND [Outer].CATEGORY = [Inner].CATEGORY
            FOR XML PATH('') ), 1, 1, '') AS ATTRIBUTES
FROM    @TableName [Outer]
GROUP BY    ID, CATEGORY;