如何獲得: 前端
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