--创建测试表
IF OBJECT_ID('test') IS NOT NULL
DROP TABLE test
CREATE TABLE dbo.test(
id int IDENTITY(1,1) NOT NULL,
name varchar(50) NULL,
subject varchar(50) NULL,
source decimal(18,2) NULL
)
GO
--插入测试数据
INSERT INTO test (name,subject,source)
SELECT '张三','语文',60 UNION ALL
SELECT '张三','英语',90 UNION ALL
SELECT '李四','语文',70 UNION ALL
SELECT '李四','数学',80 UNION ALL
SELECT '王五','数学',75 UNION ALL
SELECT '王五','英语',80
GO
SELECT * FROM test
--1 通过 select 累加
DECLARE @sql_col VARCHAR(8000)
SELECT @sql_col = ISNULL(@sql_col + ',','') + QUOTENAME(Subject) FROM test
GROUP BY Subject
SELECT @sql_col
--2 通过 FOR xml path('') 合并字符串记录
SELECT
STUFF(
(SELECT '#' + Subject
FROM test
WHERE name = '王五'
FOR xml path('')
),1,1,''
)
--3 分组合并字符串记录
SELECT
name,
Subject = (
STUFF(
(SELECT '#' + Subject
FROM test
WHERE name = A.name
FOR xml path('')
),1,1,''
)
)
FROM test A
GROUP by name