简体   繁体   English

SQL 服务器 - 将多行合并为一行

[英]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

Fiddle小提琴

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

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