【问题标题】:Need help grouping multiple rows into single string based on GROUP BY?需要根据 GROUP BY 将多行分组为单个字符串的帮助吗?
【发布时间】:2016-10-05 18:54:53
【问题描述】:

这个问题可能以前被问过,但我一直在做一些挖掘,但找不到类似的东西。提前致谢

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

样本表:

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

【问题讨论】:

  • 尝试搜索词'pivot'
  • 你能显示你尝试过的代码吗?
  • 谷歌:“聚合字符串连接”。
  • 这里有一个非常相似的问题:stackoverflow.com/q/39207098/5089204
  • 顺便说一句:为什么用xml标记?

标签: sql-server xml tsql sql-server-2005 group-by


【解决方案1】:

使用 GROUP_CONCAT()

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

【讨论】:

  • +1 用于 MySQL 或 SQLite,但其他品牌的 RDBMS 使用其他语法。 OP 没有具体说明他使用的是哪个品牌。
  • 你说得对,我的错。刚刚编辑了原始帖子,我们使用的是 SQL 2005
【解决方案2】:

试试这个

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

【讨论】:

  • 没有做到。这些属性现在只是在 Attribute1 列上重复,但用逗号分隔。即“摇滚,摇滚,摇滚,摇滚,摇滚,摇滚,摇滚,摇滚”
  • 您是否对原始查询进行了更改?它们看起来一样
【解决方案3】:

使用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;

【讨论】:

  • 谢谢!这非常有效。不幸的是,我收到了需要更多工作的更新,但我会发布另一个问题。
【解决方案4】:

对于 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 2011-11-14
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多