Sql-Server
將多行中的列合併為單行
customer_comments
由於數據庫設計,我將一些拆分為多行,對於報告,我需要將comments
每個唯一的行合併id
為一行。我之前嘗試過使用SELECT 子句和 COALESCE 技巧中的這個分隔列表,但我不記得它並且一定沒有保存它。在這種情況下,我似乎也無法讓它工作,似乎只能在一行上工作。數據如下所示:
id row_num customer_code comments ----------------------------------- 1 1 Dilbert Hard 1 2 Dilbert Worker 2 1 Wally Lazy
我的結果需要如下所示:
id customer_code comments ------------------------------ 1 Dilbert Hard Worker 2 Wally Lazy
所以對於每個
row_num
實際上只有一行結果;註釋應按row_num
. 上面的連結SELECT
技巧可以將特定查詢的所有值作為一行獲取,但我不知道如何使它作為SELECT
吐出所有這些行的語句的一部分工作。我的查詢必須自己遍歷整個表並輸出這些行。我沒有將它們組合成多列,每行一個,所以
PIVOT
似乎不適用。
這對於相關子查詢來說是相對微不足道的。您不能使用您提到的部落格文章中突出顯示的 COALESCE 方法,除非您將其提取到使用者定義的函式中(或者除非您一次只想返回一行)。以下是我通常這樣做的方式:
DECLARE @x TABLE ( id INT, row_num INT, customer_code VARCHAR(32), comments VARCHAR(32) ); INSERT @x SELECT 1,1,'Dilbert','Hard' UNION ALL SELECT 1,2,'Dilbert','Worker' UNION ALL SELECT 2,1,'Wally','Lazy'; SELECT id, customer_code, comments = STUFF((SELECT ' ' + comments FROM @x AS x2 WHERE id = x.id ORDER BY row_num FOR XML PATH('')), 1, 1, '') FROM @x AS x GROUP BY id, customer_code ORDER BY id;
如果您遇到註釋中的數據可能包含不安全的 XML 字元 (
>
,<
,&
) 的情況,您應該更改此:FOR XML PATH('')), 1, 1, '')
對於這種更精細的方法:
FOR XML PATH(''), TYPE).value(N'(./text())[1]', N'varchar(max)'), 1, 1, '')
(確保使用正確的目標數據類型,
varchar
或nvarchar
,和正確的長度,並在所有字元串文字前加上N
if usingnvarchar
。)