如何使用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
相关文章
相关标签/搜索