如何获得: 前端
id Name Value 1 A 4 1 B 8 2 C 9
至 sql
id Column 1 A:4, B:8 2 C:9
在Oracle中,您能够使用LISTAGG聚合函数。 函数
原始记录 spa
name type ------------ name1 type1 name2 type2 name2 type3
SQL code
SELECT name, LISTAGG(type, '; ') WITHIN GROUP(ORDER BY name) FROM table GROUP BY name
形成 get
name type ------------ name1 type1 name2 type2; type3
这里常常会问这种问题,而解决方案将在很大程度上取决于基本要求: io
https://stackoverflow.com/search?q=sql+pivot table
和 循环
https://stackoverflow.com/search?q=sql+concatenate bug
一般,没有动态sql,用户定义的函数或游标,就没有仅SQL的方式来执行此操做。
只是为了补充Cade所说的,这一般是前端显示,所以应在此到处理。 我知道有时候为文件导出或其余“仅SQL”解决方案之类的事情,用SQL编写100%的内容有时会更容易,可是大多数状况下,这种串联应该在您的显示层中处理。
不须要游标... while循环就足够了。
------------------------------ -- Setup ------------------------------ DECLARE @Source TABLE ( id int, Name varchar(30), Value int ) DECLARE @Target TABLE ( id int, Result varchar(max) ) INSERT INTO @Source(id, Name, Value) SELECT 1, 'A', 4 INSERT INTO @Source(id, Name, Value) SELECT 1, 'B', 8 INSERT INTO @Source(id, Name, Value) SELECT 2, 'C', 9 ------------------------------ -- Technique ------------------------------ INSERT INTO @Target (id) SELECT id FROM @Source GROUP BY id DECLARE @id int, @Result varchar(max) SET @id = (SELECT MIN(id) FROM @Target) WHILE @id is not null BEGIN SET @Result = null SELECT @Result = CASE WHEN @Result is null THEN '' ELSE @Result + ', ' END + s.Name + ':' + convert(varchar(30),s.Value) FROM @Source s WHERE id = @id UPDATE @Target SET Result = @Result WHERE id = @id SET @id = (SELECT MIN(id) FROM @Target WHERE @id < id) END SELECT * FROM @Target
不须要CURSOR,WHILE循环或用户定义的功能 。
只需使用FOR XML和PATH进行创意。
[注意:此解决方案仅适用于SQL 2005及更高版本。 原始问题未指定使用的版本。]
CREATE TABLE #YourTable ([ID] INT, [Name] CHAR(1), [Value] INT) INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (1,'A',4) INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (1,'B',8) INSERT INTO #YourTable ([ID],[Name],[Value]) VALUES (2,'C',9) SELECT [ID], STUFF(( SELECT ', ' + [Name] + ':' + CAST([Value] AS VARCHAR(MAX)) FROM #YourTable WHERE (ID = Results.ID) FOR XML PATH(''),TYPE).value('(./text())[1]','VARCHAR(MAX)') ,1,2,'') AS NameValues FROM #YourTable Results GROUP BY ID DROP TABLE #YourTable