如何使用GROUP BY鏈接SQL Server中的字符串?

如何獲得: 前端

id       Name       Value
1          A          4
1          B          8
2          C          9

sql

id          Column
1          A:4, B:8
2          C:9

#1樓

一個例子是

在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

#2樓

這裏常常會問這種問題,而解決方案將在很大程度上取決於基本要求: io

https://stackoverflow.com/search?q=sql+pivot table

循環

https://stackoverflow.com/search?q=sql+concatenate bug

一般,沒有動態sql,用戶定義的函數或遊標,就沒有僅SQL的方式來執行此操做。


#3樓

只是爲了補充Cade所說的,這一般是前端顯示,所以應在此到處理。 我知道有時候爲文件導出或其餘「僅SQL」解決方案之類的事情,用SQL編寫100%的內容有時會更容易,可是大多數狀況下,這種串聯應該在您的顯示層中處理。


#4樓

不須要遊標... 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

#5樓

不須要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
相關文章
相關標籤/搜索