Microsoft SQL Server Management Studio 中如何将多行合并为一行,以逗号分隔
How do you merge multiple rows into a single row in Microsoft SQL Server Management Studio, separate by comma
我正在尝试根据匹配 user_id.
将以下 ID 连接成一行
当前代码
SELECT
A.USER_ID,
B.POINT_ID
FROM DATABASE1 AS A
LEFT JOIN DATABASE2 as b on a.SSCL_ID = b.SEC_ID
WHERE
RECORD_STATUS in ('2','5')
and USER_STATUS = '1'
我试过下面的代码:
SELECT c.USER_ID,
STUFF((SELECT DISTINCT ',' + cast(POINT_ID as varchar(10))
FROM DATABASE1 A
LEFT JOIN DATABASE2 as b on a.SSCL_ID = b.SEC_ID
FOR XML PATH ('')), 1, 1, '')
from DATABASE1 c
WHERE
RECORD_STATUS in ('2','5')
and USER_STATUS = '1'
group by c.USER_ID
可以使用string_agg()
吗?
SELECT A.USER_ID, STRING_AGG(B.POINT_ID, ',')
FROM DATABASE1 A LEFT JOIN
DATABASE2 b
ON a.SSCL_ID = b.SEC_ID
WHERE RECORD_STATUS in ('2', '5') AND
USER_STATUS = '1'
GROUP BY A.USER_ID;
请尝试以下解决方案。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, [USER_ID] VARCHAR(10), POINT_ID INT);
INSERT INTO @tbl ([USER_ID], POINT_ID) VALUES
('T0070',1 ),
('T0070',2 ),
('T0070',3 ),
('T1234',10),
('T1234',11),
('T1234',12),
('T1234',13),
('T1234',14);
-- DDL and sample data population, end
DECLARE @separator CHAR(1) = ',';
SELECT p.[USER_ID],
STUFF((SELECT @separator + CAST(POINT_ID AS VARCHAR(30)) AS [text()]
FROM @tbl AS c
WHERE c.[USER_ID] = p.[USER_ID]
ORDER BY c.POINT_ID
FOR XML PATH(''), TYPE).value('text()[1]','NVARCHAR(MAX)'), 1, 1, NULL) AS POINT_ID_LIST
FROM @tbl AS p
GROUP BY p.USER_ID;
输出
+---------+----------------+
| USER_ID | POINT_ID_LIST |
+---------+----------------+
| T0070 | 1,2,3 |
| T1234 | 10,11,12,13,14 |
+---------+----------------+
内部FOR XML PATH
聚合必须是外部USER_ID
的函数
with cte as(
SELECT
A.USER_ID,
B.POINT_ID
FROM DATABASE1 AS A
LEFT JOIN DATABASE2 as b on a.SSCL_ID = b.SEC_ID
WHERE
RECORD_STATUS in ('2','5')
and USER_STATUS = '1'
)
SELECT c1.USER_ID,
STUFF((SELECT ',' + cast(POINT_ID as varchar(10))
FROM cte c2
WHERE c2.USER_ID = c1.USER_ID
FOR XML PATH ('')), 1, 1, '')
FROM cte c1
我正在尝试根据匹配 user_id.
将以下 ID 连接成一行当前代码
SELECT
A.USER_ID,
B.POINT_ID
FROM DATABASE1 AS A
LEFT JOIN DATABASE2 as b on a.SSCL_ID = b.SEC_ID
WHERE
RECORD_STATUS in ('2','5')
and USER_STATUS = '1'
我试过下面的代码:
SELECT c.USER_ID,
STUFF((SELECT DISTINCT ',' + cast(POINT_ID as varchar(10))
FROM DATABASE1 A
LEFT JOIN DATABASE2 as b on a.SSCL_ID = b.SEC_ID
FOR XML PATH ('')), 1, 1, '')
from DATABASE1 c
WHERE
RECORD_STATUS in ('2','5')
and USER_STATUS = '1'
group by c.USER_ID
可以使用string_agg()
吗?
SELECT A.USER_ID, STRING_AGG(B.POINT_ID, ',')
FROM DATABASE1 A LEFT JOIN
DATABASE2 b
ON a.SSCL_ID = b.SEC_ID
WHERE RECORD_STATUS in ('2', '5') AND
USER_STATUS = '1'
GROUP BY A.USER_ID;
请尝试以下解决方案。
SQL
-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, [USER_ID] VARCHAR(10), POINT_ID INT);
INSERT INTO @tbl ([USER_ID], POINT_ID) VALUES
('T0070',1 ),
('T0070',2 ),
('T0070',3 ),
('T1234',10),
('T1234',11),
('T1234',12),
('T1234',13),
('T1234',14);
-- DDL and sample data population, end
DECLARE @separator CHAR(1) = ',';
SELECT p.[USER_ID],
STUFF((SELECT @separator + CAST(POINT_ID AS VARCHAR(30)) AS [text()]
FROM @tbl AS c
WHERE c.[USER_ID] = p.[USER_ID]
ORDER BY c.POINT_ID
FOR XML PATH(''), TYPE).value('text()[1]','NVARCHAR(MAX)'), 1, 1, NULL) AS POINT_ID_LIST
FROM @tbl AS p
GROUP BY p.USER_ID;
输出
+---------+----------------+
| USER_ID | POINT_ID_LIST |
+---------+----------------+
| T0070 | 1,2,3 |
| T1234 | 10,11,12,13,14 |
+---------+----------------+
内部FOR XML PATH
聚合必须是外部USER_ID
with cte as(
SELECT
A.USER_ID,
B.POINT_ID
FROM DATABASE1 AS A
LEFT JOIN DATABASE2 as b on a.SSCL_ID = b.SEC_ID
WHERE
RECORD_STATUS in ('2','5')
and USER_STATUS = '1'
)
SELECT c1.USER_ID,
STUFF((SELECT ',' + cast(POINT_ID as varchar(10))
FROM cte c2
WHERE c2.USER_ID = c1.USER_ID
FOR XML PATH ('')), 1, 1, '')
FROM cte c1