需要帮助根据 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;
以前可能有人问过这个问题,但我一直在进行一些挖掘,但找不到任何类似的问题。提前致谢
编辑:完全忘记了。我们使用 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;