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

如何得到:

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

id Column
1 A:4, B:8
2 C:9
#1楼
一个例子是
在Oracle中,您可以使用LISTAGG聚合函数。

原始记录

name type

name1 type1
name2 type2
name2 type3
SQL

SELECT name, LISTAGG(type, '; ') WITHIN GROUP(ORDER BY name)
FROM table
GROUP BY name
造成

name type

name1 type1
name2 type2; type3
#2楼
这里经常会问这种问题,而解决方案将在很大程度上取决于基本要求:

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

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

通常,没有动态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

发布了124 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/a59612/article/details/104505138