SQL Server中的SQL group_conat函数

如果有一个名为Employee的表


EmpID           EmpName

----------      -------------

1               Mary

1               John

1               Sam

2               Alaina

2               Edward

我需要这种格式的结果:


EmpID           EmpName

----------      -------------

1               Mary, John, Sam

2               Alaina, Edward

问:这个记录是一样的。Employee桌子。我几乎没有使用UDF,存储过程的经验,我需要通过查询来完成这件事,这不可能不使用UDF,SP的。



慕婉清6462132
浏览 546回答 3
3回答

PIPIONE

这个测试场景将说明这一点。创建临时表:CREATE table #temp (EmpId INT, EmpName VARCHAR(100));WITH N(N)AS (SELECT 1 FROM(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1))M(N)) ,tally(N)AS(SELECT ROW_NUMBER()OVER(ORDER BY N.N)FROM N,N a,N b,N c,N d,N e,N f)INSERT #tempSELECT EmpId, EmpName FROM (values(1, 'M ary'),(1, 'John'),(1, 'Sam')) x(EmpId, EmpName)CROSS APPLY (SELECT top 2000 N FROM tally) yUNION ALLSELECT EmpId, EmpName FROM (valu es(2, 'Alaina'),(2, 'Edward')) x(EmpId, EmpName)CROSS APPLY(SELECT top 2000 N FROM tally) y这只有10.000行。但很多相同的空白处。Oleg的答案中的这个查询在我的数据库上花费了64秒。SELECT distinct     EmpId,     (         SELECT EmpName+','         FROM #temp t2        WHERE t2.EmpId = t1.EmpId        FOR XML PATH('')     ) ConcatenatedFROM #temp t1在这种情况下,区分不是清理行的正确方法。为了避免这个笛卡儿连接,在像这样加入之前减少ID的初始数量。这是正确的处理方法:;WITH CTE as(   SELECT distinct EmpId  FROM #temp)SELECT      EmpId,     STUFF((         SELECT ','+EmpName        FROM #temp t2        WHERE t2.EmpId = t1.EmpId        FOR XML PATH('')     ), 1,1,'') ConcatenatedFROM CTE t1这需要不到1秒

慕姐8265434

我想没有GROUP_CONCAT函数在MSSQL中。当项目数量较小且预先已知时,收缩值SELECT CategoryId,        MAX( CASE seq WHEN 1 THEN ProductName ELSE '' END ) + ', ' +        MAX( CASE seq WHEN 2 THEN ProductName ELSE '' END ) + ', ' +        MAX( CASE seq WHEN 3 THEN ProductName ELSE '' END ) + ', ' +        MAX( CASE seq WHEN 4 THEN ProductName ELSE '' END )   FROM ( SELECT p1.CategoryId, p1.ProductName,                 ( SELECT COUNT(*)                      FROM Northwind.dbo.Products p2                                        WHERE p2.CategoryId = p1.CategoryId                                           AND p2.ProductName <= p1.ProductName )            FROM Northwind.dbo.Products p1 ) D ( CategoryId, ProductName, seq )  GROUP BY CategoryId ;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

SQL Server