2011-03-23 28 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