2012-07-03 73 views
1

字符串數據有數據表:我如何聚合T-SQL

|Key|Field |DateField | 
|A |Value1|2012-06-01| 
|A |Value2|2012-06-02| 
|A |Value3|2012-06-03| 
|B |Value4|2012-06-04| 
|B |Value5|2012-06-05| 

我想通過彙總關鍵這個字符串數據 - 一組類似,但我不能工作如何。 我想直到結束是:

|Key|Field Aggregate  | 
|A |Value1, Value2, Value3| 
|B |Value4, Value5  | 

更妙的是將與插入其中序列的順序由相應的日期字段的順序確定的聚集序列位置結束。

|Key|Field Aggregate    | 
|A |1: Value1, 2: Value2, 3: Value3| 
|B |1: Value4, 2: Value5   | 

這看起來像我可以做一個公用表表達式,但我似乎無法解決如何。

我通常不會在SQL中執行這種操作 - 我通常會將數據拖入應用程序並在代碼中根據需要操作它。

不幸的是,在這種情況下,這似乎不是一種選擇。

如何在SQL Server 2005 T-SQL中執行此操作。

CTE是一種正確的方法嗎?有什麼更合適的嗎?

+0

您如何確定序列?這是在字段上按字母順序排列的,還是有另一列我們看不到順序? –

+0

好問題,已經更新了這個問題來澄清。 –

回答

4
DECLARE @t TABLE([Key] CHAR(1), [Field] VARCHAR(32), DateField DATETIME); 

INSERT @t SELECT 'A','Value1','20120601' 
UNION ALL SELECT 'A','Value2','20120602' 
UNION ALL SELECT 'A','Value3','20120603' 
UNION ALL SELECT 'B','Value4','20120604' 
UNION ALL SELECT 'B','Value5','20120605'; 

;WITH x AS 
(
    SELECT [Key], [Field], rn = ROW_NUMBER() OVER 
    (PARTITION BY [Key] ORDER BY [DateField]) 
    FROM @t 
) 
SELECT [Key], [Field Aggregate] = STUFF(
    (SELECT ', ' + CONVERT(VARCHAR(12), rn) + ': ' + [Field] 
    FROM x AS x2 WHERE x2.[Key] = x.[Key] 
    ORDER BY rn 
    FOR XML PATH('') 
), 1, 2, '') 
FROM x 
GROUP BY [Key] 
ORDER BY [Key]; 

結果:

Key Field Aggregate 
--- ------------------------------- 
A 1: Value1, 2: Value2, 3: Value3 
B 1: Value4, 2: Value5 

P.S.如果您在Field值可能包含用於XML(如&><等)問題的字符,你會想改變這一行:

), 1, 2, '') 

要這樣:

, TYPE).value('.', 'nvarchar(max)'), 1, 2, '') 

(這將阻止實體化。)

+0

訂單由原始表上的附加日期時間字段確定。對不起 - 我添加了這個問題作爲事後的想法,並沒有檢查問題仍然有意義。 –

+0

我更新了'DateField'的排序,即使在你的示例數據中它也不會改變任何東西... –

+0

這種類型的代碼就是我討厭和喜愛SQL Server的原因。 – bfavaretto