简体   繁体   中英

SQL Server - merge several rows into one

I have a table Articles where same the article may have different 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.

If there is one article in the table the new column should be just that ArtId and no comma after that.

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:

SELECT ArtNo, STRING_AGG(ArtId, ', ') AS IDs
FROM YourTable
GROUP BY ArtNo ;

Here' sa sultion for older versions of Sql Server.

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 ArtName ArtNo
1110 Green Dress 123455
1200,1300 Purple Dress 987654
100,110,220,308,605,999 Red Dress 0123456

Fiddle

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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