簡體   English   中英

T-SQL:將多行值合並為一個值

[英]T-SQL: Concat multiple rows value in into one value

我使用CTE做一個例子,這是

with CTE as
(
Select 'John' as Name, 'Book' as Product
Union all
Select 'John' as Name, 'Pen' as Product
Union all
Select 'John' as Name, 'Phone' as Product
Union all
Select 'Kevin' as Name, 'Book' as Product
Union all
Select 'Kevin' as Name, 'Watch' as Product
) 

SELECT Name, Product=STUFF(
             (SELECT ';' + Product FROM CTE t2
              WHERE t1.Name = t2.Name 
              FOR XML PATH ('')) , 1, 1 , '')
FROM CTE t1
GROUP BY Name

如果你先

select * from CTE 

然后您將看到原始數據的樣子

這是我在Internet上找到的一種方法,但首先我不了解它的工作原理,如果有人可以解釋我的工作原理,我將不勝感激。

謝謝!

首先,這是完成嘗試工作的最佳方法。 特別是與其他方法相比,它非常高效。 讓我解釋一下它是如何工作的。

--So first your group by is grouping by name. 
    --It's really just getting the DISTINCT values of name
    --You could actually use a distinct name instead of the group by clause
SELECT  Name, 
        Product = 
                (
                --This combines your semicolon to each value of product
                SELECT ';' + Product 
                FROM CTE t2
                --This connects this subquery to the outer query
                WHERE t1.Name = t2.Name 

                --I don't know how this works exactly. It obviously uses some kind of XML parsing, but it concats all your rows together into one
                FOR XML PATH ('')
                )
FROM CTE t1
GROUP BY Name

結果:

Name  Product
----- ----------------
John  ;Book;Pen;Phone
Kevin ;Book;Watch

您會注意到我擺脫了STUFF(),向您展示了它所做的只是刪除第一個分號。 如果需要,可以改用SUBSTRING()。

希望這可以幫助。 需要幫助請叫我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM