我正在尝试组合行的部分内容,这些行是SQL Server 2005中读取.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存储过程或游标,那没关系,尽管我在编写它们时效率不高。
感谢所有人。
答案 0 :(得分: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.