[英]SQL Server - merge several rows into one
I have a table Articles
where same the article may have different Id ( ArtId
).我有一个Articles
表,其中相同的文章可能有不同的 Id ( ArtId
)。
What I'm trying to achieve is to merge the same article rows into one, based on ArtNo
column, and to CONCAT
the ArtId
column values into a new columns ArtIds
, separated by comma.我想要实现的是基于ArtNo
列将相同的文章行合并为一个,并将ArtId
列值CONCAT
到新列ArtIds
中,以逗号分隔。
If there is one article in the table the new column should be just that ArtId
and no comma after that.如果表格中只有一篇文章,那么新列应该就是那个ArtId
,后面没有逗号。
I try the following, but without result on what I want to achieve:我尝试了以下操作,但没有达到我想要实现的目标:
DECLARE @tbl TABLE
(
ArtId INT,
ArtName VARCHAR(100),
ArtNo VARCHAR(50)
);
INSERT INTO @tbl (ArtId, ArtName, ArtNo)
SELECT 100, 'Red Dress', '0123456' UNION ALL
SELECT 110, 'Red Dress', '0123456' UNION ALL
SELECT 220, 'Red Dress', '0123456' UNION ALL
SELECT 308, 'Red Dress', '0123456' UNION ALL
SELECT 605, 'Red Dress', '0123456' UNION ALL
SELECT 999, 'Red Dress', '0123456' UNION ALL
SELECT 1110, 'Green Dress', '123455' UNION ALL
SELECT 1200, 'Purple Dress', '987654' UNION ALL
SELECT 1300, 'Purple Dress', '987654'
SELECT DISTINCT
*
FROM
(SELECT
t2.ArtIds,
t2.ArtNo AS ArtNoT2,
t1.ArtName,
t1.ArtNo
FROM
@tbl t1
INNER JOIN
(SELECT
at2.ArtNo,
SUBSTRING((SELECT ',' + CAST(at1.ArtId AS VARCHAR) AS [text()]
FROM @tbl at1
WHERE at1.ArtId != at2.ArtId
AND at1.ArtNo = at2.ArtNo
ORDER BY at1.ArtId
FOR XML PATH(''), TYPE).value('text()[1]', 'nvarchar(max)'), 2, 1000) [ArtIds]
FROM @tbl at2) t2 ON t2.ArtNo = t1.ArtNo
) Z
GROUP BY
Z.ArtIds, Z.ArtNo, Z.ArtNoT2, Z.ArtName, Z.ArtNo;
But I get this result:但我得到这个结果:
Can you help me to achieve what I'm looking for?你能帮我实现我想要的吗?
Thank you in advance先感谢您
If on Azure or on v2017 or later, try something like:如果在 Azure 或 v2017 或更高版本上,请尝试以下操作:
SELECT ArtNo, STRING_AGG(ArtId, ', ') AS IDs
FROM YourTable
GROUP BY ArtNo ;
Here' sa sultion for older versions of Sql Server.这是旧版本 Sql 服务器的一个解决方案。
DECLARE @tbl TABLE
(
ArtId INT,
ArtName VARCHAR(100),
ArtNo VARCHAR(50)
);
INSERT INTO @tbl (ArtId, ArtName, ArtNo)
SELECT 100, 'Red Dress', '0123456' UNION ALL
SELECT 110, 'Red Dress', '0123456' UNION ALL
SELECT 220, 'Red Dress', '0123456' UNION ALL
SELECT 308, 'Red Dress', '0123456' UNION ALL
SELECT 605, 'Red Dress', '0123456' UNION ALL
SELECT 999, 'Red Dress', '0123456' UNION ALL
SELECT 1110, 'Green Dress', '123455' UNION ALL
SELECT 1200, 'Purple Dress', '987654' UNION ALL
SELECT 1300, 'Purple Dress', '987654'
select (stuff((select ',' + cast(ArtId as varchar)
from @tbl t2
where t.ArtName = t2.ArtName
for xml path(''), type).value('.', 'varchar(max)'), 1, 1, '')) as ArtIds
,ArtName
,ArtNo
from @tbl t
group by ArtName, ArtNo
ArtIds ArtIds | ArtName艺术名称 | ArtNo货号 |
---|---|---|
1110 1110 | Green Dress绿色连衣裙 | 123455 123455 |
1200,1300 1200,1300 | Purple Dress紫色连衣裙 | 987654 987654 |
100,110,220,308,605,999 100,110,220,308,605,999 | Red Dress红色礼服 | 0123456 0123456 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.