Sql 基于varchar字段的逗号分隔输出

Sql 基于varchar字段的逗号分隔输出,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有这个 MS SQL Server 2008架构设置: CREATE TABLE AccessUser ( AccessUserID int, AccessUserName varchar(255), AccessUserType int, AccessUserGroups varchar(255) ); INSERT INTO AccessUser ( AccessUserID, AccessUserName, AccessU

我有这个

MS SQL Server 2008架构设置

CREATE TABLE AccessUser
(
    AccessUserID int, 
    AccessUserName varchar(255), 
    AccessUserType int, 
    AccessUserGroups varchar(255)
);

INSERT INTO AccessUser
(   AccessUserID, 
    AccessUserName, 
    AccessUserType, 
    AccessUserGroups
)
VALUES
    (1, 'Group 1', 2, ''),
    (2, 'Group 2', 2, ''),
    (3, 'John', 5, '@1@'),
    (4, 'Nick', 5, '@1@@2@');
SELECT DISTINCT
Empl.AccessUserName AS Name,
Firm.AccessUserName AS FirmName
FROM AccessUser AS Firm, AccessUser AS Empl
WHERE Empl.AccessUserType = 5
AND Empl.AccessUserGroups LIKE ('%@' + CAST(Firm.AccessUserID AS VARCHAR(10)) + '@%')
ORDER BY Empl.AccessUserName ASC
| NAME | FIRMNAME |
|------|----------|
| John |  Group 1 |
| Nick |  Group 1 |
| Nick |  Group 2 |
查询1

CREATE TABLE AccessUser
(
    AccessUserID int, 
    AccessUserName varchar(255), 
    AccessUserType int, 
    AccessUserGroups varchar(255)
);

INSERT INTO AccessUser
(   AccessUserID, 
    AccessUserName, 
    AccessUserType, 
    AccessUserGroups
)
VALUES
    (1, 'Group 1', 2, ''),
    (2, 'Group 2', 2, ''),
    (3, 'John', 5, '@1@'),
    (4, 'Nick', 5, '@1@@2@');
SELECT DISTINCT
Empl.AccessUserName AS Name,
Firm.AccessUserName AS FirmName
FROM AccessUser AS Firm, AccessUser AS Empl
WHERE Empl.AccessUserType = 5
AND Empl.AccessUserGroups LIKE ('%@' + CAST(Firm.AccessUserID AS VARCHAR(10)) + '@%')
ORDER BY Empl.AccessUserName ASC
| NAME | FIRMNAME |
|------|----------|
| John |  Group 1 |
| Nick |  Group 1 |
| Nick |  Group 2 |

CREATE TABLE AccessUser
(
    AccessUserID int, 
    AccessUserName varchar(255), 
    AccessUserType int, 
    AccessUserGroups varchar(255)
);

INSERT INTO AccessUser
(   AccessUserID, 
    AccessUserName, 
    AccessUserType, 
    AccessUserGroups
)
VALUES
    (1, 'Group 1', 2, ''),
    (2, 'Group 2', 2, ''),
    (3, 'John', 5, '@1@'),
    (4, 'Nick', 5, '@1@@2@');
SELECT DISTINCT
Empl.AccessUserName AS Name,
Firm.AccessUserName AS FirmName
FROM AccessUser AS Firm, AccessUser AS Empl
WHERE Empl.AccessUserType = 5
AND Empl.AccessUserGroups LIKE ('%@' + CAST(Firm.AccessUserID AS VARCHAR(10)) + '@%')
ORDER BY Empl.AccessUserName ASC
| NAME | FIRMNAME |
|------|----------|
| John |  Group 1 |
| Nick |  Group 1 |
| Nick |  Group 2 |
问题:如何修改查询以输出此信息:

| NAME |      FIRMNAME      |
|------|--------------------|
| John |  Group 1           |
| Nick |  Group 1, Group 2  |
如果用户有多个
AccessUserGroups
,我要做的是将Firmname分隔开。 甚至可以在一个查询中执行此操作吗?

您可以这样做:

WITH CTE AS
(SELECT DISTINCT
Empl.AccessUserName AS Name,
Firm.AccessUserName AS FirmName
FROM AccessUser AS Firm, AccessUser AS Empl
WHERE Empl.AccessUserType = 5
AND Empl.AccessUserGroups LIKE ('%@' + CAST(Firm.AccessUserID AS VARCHAR(10)) + '@%'))

SELECT Name,
      FirmName = STUFF((
          SELECT ',' + convert(varchar(10),T2.FirmName)
          FROM CTE T2
          WHERE T1.Name = T2.Name
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM CTE T1
GROUP BY Name
ORDER BY FirmName
结果:

NAME    FIRMNAME
John    Group 1
Nick    Group 1,Group 2