【问题标题】:Merging multiple rows with same ID in SQL Server在 SQL Server 中合并具有相同 ID 的多行
【发布时间】:2019-06-10 21:45:36
【问题描述】:

在 SQL Server 中组合具有相同 ID 的多行值最有效的方法是什么?

原始数据表dbo.ProductCategory

+-----------+----------+------+
| ProductID |  CATID   |  AA  |
+-----------+----------+------+
|  1        | 123      | A    |
|  1        | 412      | B    |
|  2        | 567      | C    |
|  2        | 521      | A    |
|  3        |   2      | D    |
|  3        |   5      | A    |
|  4        |   6      | C    |
|  4        |   8      | E    |
|  4        | 123      | A    |
+----+------+----------+------+

我正在努力实现以下结果

+-----------+----------+------+
| ProductID |  CATID   |  AA  |
+-----------+----------+------+
|  1        | 123,412  | A,B  |
|  2        | 567,521  | C,A  |
|  3        | 2,5      | D,A  |
|  4        | 6,8,123  | C,E,A|
+----+------+----------+------+

【问题讨论】:

标签: sql-server merge


【解决方案1】:

在 SQL Server 2017+ 中,您可以使用 STRING_AGG

select ProductId, STRING_AGG(CATID, ',') as CATID, STRING_AGG(AA, ',') AA
from PC
GROUP BY ProductID

【讨论】:

  • 非常感谢,这比我找到的其他参考资料要简单得多!
  • 如果你觉得这个答案有用,请考虑标记为答案。谢谢
【解决方案2】:

样本数据

DECLARE @Temp AS TABLE (ProductID INT,  CATID  INT,  AA  CHAR(2))
INSERT INTO @Temp
SELECT 1 , 123 , 'A' UNION ALL    
SELECT 1 , 412 , 'B' UNION ALL    
SELECT 2 , 567 , 'C' UNION ALL    
SELECT 2 , 521 , 'A' UNION ALL    
SELECT 3 ,   2 , 'D' UNION ALL    
SELECT 3 ,   5 , 'A' UNION ALL    
SELECT 4 ,   6 , 'C' UNION ALL    
SELECT 4 ,   8 , 'E' UNION ALL    
SELECT 4 , 123 , 'A' 

在 sql server 中使用 STUFF()

SELECT ProductID,STUFF((SELECT CONCAT(', ', CATID) 
                        FROM @Temp i 
                        WHERE i.ProductID = o.ProductID
                FOR XML PATH ('')),1,1,'') AS CATID
                ,STUFF((SELECT CONCAT(', ', AA) 
                        FROM @Temp i 
                        WHERE i.ProductID = o.ProductID
                FOR XML PATH ('')),1,1,'') AS AA
FROM @Temp o
GROUP BY ProductID

结果

ProductID   CATID         AA
------------------------------------
1           123, 412     A , B 
2           567, 521     C , A 
3           2, 5         D , A 
4           6, 8, 123    C , E , A 

【讨论】:

    猜你喜欢
    • 2016-11-03
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    相关资源
    最近更新 更多