我正在尝试合并行的部分内容,这些行是SQL Server2005中读取.CSV的查询的结果集。以下是我拥有的数据的简化版本:
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存储过程或游标,那也没问题,尽管我在编写它们方面还不是很高效。
感谢所有人。
发布于 2011-03-24 05:10:47
首先将数据导入到临时表中。临时表将以类似以下示例数据的形式结束:
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.https://stackoverflow.com/questions/5411176
复制相似问题