Sql 基于varchar字段的逗号分隔输出
我有这个 MS SQL Server 2008架构设置: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
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