繁体   English   中英

如何在 Microsoft SQL Server Management Studio 中将多行合并为一行

[英]How do you concat multiple rows into a single row in Microsoft SQL Server Management Studio

我正在尝试根据匹配的 USER_ID 将以下 point_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'

当前 output

用户身份 POINT_ID
T0070 1
T0070 2
T0070 3
T1234 10
T1234 11
T1234 12
T1234 13
T1234 14

预期 output

用户身份 POINT_ID
T0070 1、2、3
T1234 10、11、12、13、14

我尝试了以下代码:

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

但是,我得到以下 output:

用户身份 POINT_ID
T0070 1、2、3
T1234 1、2、3

请尝试以下解决方案。

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;

Output

+---------+----------------+
| USER_ID | POINT_ID_LIST  |
+---------+----------------+
| T0070   |          1,2,3 |
| T1234   | 10,11,12,13,14 |
+---------+----------------+

你可以使用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;

内部FOR XML PATH聚合必须是外部USER_ID的 function

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM