SQL SELECT - 将单个行上的多个值分组

Saw*_*Gor 3 sql sql-server sql-server-2005

我有一个包含以下数据的表:

ID  CAT  TYPE   SUBPRODUCT
--- ---- ------ ----------------
1   1     1       AA
2   1     1       BB
3   1     2       CC
Run Code Online (Sandbox Code Playgroud)

我想得到这样的数据:

CAT   TYPE   SUBPRODUCT
----- ------ ---------------
1     1      AA,BB
1     2      CC
Run Code Online (Sandbox Code Playgroud)

请回复我,我该怎么办.

谢谢.

Lie*_*ers 7

你可以用FOR XML PATH.虽然有点难以阅读,但它目前是连接字符串最简洁的方法.

分解

  • FOR XML PATH 连接与subselect匹配的所有值
  • STUFF 删除前导逗号

SQL语句

SELECT  q.CAT
        , q.TYPE
        , SUBPRODUCT = STUFF((SELECT ', ' + qi.SUBPRODUCT FROM q qi WHERE qi.Cat = q.Cat AND qi.Type = q.Type FOR XML PATH('')), 1, 2, '')
FROM    q
GROUP BY
        q.CAT
        , q.TYPE
Run Code Online (Sandbox Code Playgroud)

测试脚本

;WITH q AS (
  SELECT * FROM (VALUES 
    (1, 1, 1, 'AA')
    , (2, 1, 1, 'BB')
    , (3, 1, 2, 'CC')
  ) AS a (ID, CAT, TYPE, SUBPRODUCT)    
)
SELECT  q.CAT
        , q.TYPE
        , SUBPRODUCT = STUFF((SELECT ', ' + qi.SUBPRODUCT FROM q qi WHERE qi.Cat = q.Cat AND qi.Type = q.Type FOR XML PATH('')), 1, 2, '')
FROM    q
GROUP BY
        q.CAT
        , q.TYPE
Run Code Online (Sandbox Code Playgroud)