[英]How to output a single column or concatenate another one if multiple rows are in group in T-SQL
[英]How to concatenate results in T-SQL into column?
我正在研究一個應該給我結果的查詢:
|--Name--|--Surname--|--Language--|--Date-- | | James | Hetfield | en,gb,fr | 2011-01-01| | Lars | Ulrich | gb,fr,ca | 2011-01-01|
但我的選擇得到一組行,如:
| James | Hetfield | en | 2011-01-01| | James | Hetfield | gb | 2011-01-01| | James | Hetfield | fr | 2011-01-01| | Lars | Ulrich | gb | 2011-01-01| | Lars | Ulrich | fr | 2011-01-01| | Lars | Ulrich | ca | 2011-01-01|
您建議使用哪種最佳方法將結果集轉換為“動態”分組列中的逗號分隔值? 我發現CROSS APPLY可以完成這項工作,但人們說這種方法很耗費。 作為一個額外的DB有大量的數據。
在此先感謝,問候,阿德里安
這是最好的連接方法,它不會像其他XML方法那樣擴展特殊字符:
--Concatenation with FOR XML & eliminating control/encoded char expansion "& < >"
set nocount on;
declare @YourTable table (RowID int, HeaderValue int, ChildValue varchar(5))
insert into @YourTable VALUES (1,1,'CCC')
insert into @YourTable VALUES (2,2,'B<&>B')
insert into @YourTable VALUES (3,2,'AAA')
insert into @YourTable VALUES (4,3,'<br>')
insert into @YourTable VALUES (5,3,'A & Z')
set nocount off
SELECT
t1.HeaderValue
,STUFF(
(SELECT
', ' + t2.ChildValue
FROM @YourTable t2
WHERE t1.HeaderValue=t2.HeaderValue
ORDER BY t2.ChildValue
FOR XML PATH(''), TYPE
).value('.','varchar(max)')
,1,2, ''
) AS ChildValues
FROM @YourTable t1
GROUP BY t1.HeaderValue
OUTPUT:
HeaderValue ChildValues
----------- ---------------
1 CCC
2 AAA, B<&>B
3 <br>, A & Z
(3 row(s) affected)
如果您的SQL版本支持FOR XML使用
select n.[name],CONVERT(VARCHAR(MAX),(SELECT *
FROM (
SELECT l.[lang] + ' , ' AS '*'
FROM tblLang l
WHERE l.[name]=n.[name]
) x
FOR XML PATH (''), TYPE
)) AS [Language]
from tblName n
這假設簡單的表格
tblName
-------
name VARCHAR
tblLang
-------
lang VARCHAR
name VARCHAR
它還添加了一個尾隨,
:(
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.