2011-03-23 27 views
4

我試圖合併部分內容的行,它們是讀取.CSV的SQL Server 2005查詢的結果集。這是我擁有的數據的簡化版本:將類似列中的數據合併到單行中

objectID | value1 | value2 
_________________________________ 
12  | R  | 100 
12  | R  | 101 
12  | S  | 220 
13  | D  | 88 
14  | K  | 151 
14  | K  | 152 

我試圖去爲每一個的objectID的值在同一行分組,以便有一個且只有一個每個的objectID列。以圖形方式:

objectID | value1a | value2a | value 1b | value2b | value1c | value2c 
______________________________________________________________________________ 
12  | R  | 100  | R   | 101  | S  | 220 
13  | D  | 88  |   |   |   | 
14  | K  | 151  | K   | 152  |   | 

空白單元格爲空白。我一直希望在沒有VB的Excel或Access中執行此操作,但CONCAT和其他類似的函數(以及此處和其他地方提供的類似方法的響應)不起作用,因爲每個值都需要保留在它自己的單元格中這些數據最終將與Word形式合併)。如果答案是一個SQL存儲過程或遊標,沒關係,儘管我現在寫的東西不是非常高效。

感謝所有。

+0

哪裏是你的數據的權利嗎? SQL Server,Access或Excel? – 2011-03-23 20:26:27

+0

Google術語「數據透視表」加上您的數據所在的特定平臺 – asawyer 2011-03-23 20:29:33

+0

p.campbell:這是一個CSV和SQL Server 2005上F5的業務端。 – checkypantz 2011-03-23 20:32:45

回答

4

首先將數據導入臨時表。該臨時表將結束這樣的樣本數據:

create table #tmp (objectID int, value1 char(1), value2 int) 
insert #tmp select 
12 ,'R', 100 union all select 
12 ,'R', 101 union all select 
12 ,'S', 220 union all select 
13 ,'D', 88 union all select 
14 ,'K', 151 union all select 
14 ,'K', 152 

然後,您可以使用此SQL批處理 - 它可根據需要被放入一個存儲過程。

declare @sql nvarchar(max) 
select @sql = ISNULL(@sql+',','') 
     + 'max(case when rn=' + cast(number as varchar) + ' then value1 end) value' + cast(number as varchar) + 'a,' 
     + 'max(case when rn=' + cast(number as varchar) + ' then value2 end) value' + cast(number as varchar) + 'b' 
from master..spt_values 
where type='P' and number between 1 and (
    select top 1 COUNT(*) 
    from #tmp 
    group by objectID 
    order by 1 desc) 

set @sql = ' 
    select objectID, ' + @sql + ' 
    from (
     select rn=ROW_NUMBER() over (partition by objectID order by value2), * 
     from #tmp) p 
    group by ObjectID' 

exec (@sql) 

輸出

objectID value1a value1b  value2a value2b  value3a value3b 
----------- ------- ----------- ------- ----------- ------- ----------- 
12   R  100   R  101   S  220 
13   D  88   NULL NULL  NULL NULL 
14   K  151   K  152   NULL NULL 
Warning: Null value is eliminated by an aggregate or other SET operation. 
+0

+1,非常好的解決方案。 – Lamak 2011-03-23 21:33:27