在SQL查询中合并行

时间:2019-06-13 11:50:26

标签: sql sql-server

在我的SQL数据库中,我有几个用户和几个组。因此,现在我当前的查询存在查询显示的问题:

Actual query result

有什么方法可以获取查询结果:

Desired result

我已经尝试了'group_concat',但是我的SQL Server不知道该命令。

3 个答案:

答案 0 :(得分:2)

使用XML可能是一种可能的解决方案,尤其是如果您还不能使用STRING_AGG()

SELECT DISTINCT
    [ID],
    [user],
    STUFF((SELECT ', ' + [group]
           FROM [MyTable]
           WHERE [ID] = T.[ID] AND [user] = T.[user]
           FOR XML PATH('')), 1, 2, '') AS [groups]
FROM
    [MyTable] AS T

子查询将组转换为“ XML”结果字符串(在这种情况下,只是纯文本)。每个单独的组前面都有一个分隔符(', '),在这种情况下,分隔符的长度为2个字符。应该使用STUFF函数从最终结果中删除第一个分隔符。

答案 1 :(得分:0)

group_concat()是特定于MySQL的,因此您不能在SQL Server中使用它。

从SQL Server 2017开始,使用STRING_AGG()函数,这是可能的:

SELECT ID, [User], STRING_AGG ([group], ', ') AS [group]
FROM TableName
GROUP BY ID, [User]

答案 2 :(得分:0)

有空的时候看看下面的链接。

https://www.red-gate.com/simple-talk/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

您将从该资源中学到很多东西。

SELECT *
FROM [NORTHWND].[dbo].[Products]

enter image description here

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 NORTHWND.dbo.Products p2
                        WHERE p2.CategoryId = p1.CategoryId
                        AND p2.ProductName <= p1.ProductName )
             FROM NORTHWND.dbo.Products p1 ) D ( CategoryId, ProductName, seq )
     GROUP BY CategoryId ;

enter image description here