Sql-Server

將多行中的列合併為單行

  • November 7, 2016

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, '')

(確保使用正確的目標數據類型,varcharnvarchar,和正確的長度,並在所有字元串文字前加上Nif using nvarchar。)

引用自:https://dba.stackexchange.com/questions/17921