我有一个返回大量客户结果的SQL查询。
每个客户都有一个唯一的ID,但可能有多个交易。
而不是每个客户有多行我想拥有一行并为不同的信息生成多列。
例如我有:
id | name | purchase price | date
3 | tim | 20 | 08-2-2014
3 | tim | 25 | 08-5-2014
我希望它能阅读
id | name | purchase price 1 | date 1 | purchase price 2 | date 2
3 | tim | 20 | 08-2-2014 | 25 | 08-5-2014
我不知道从哪里开始。
答案 0 :(得分:2)
这是使用动态交叉表完成的。 供参考:http://www.sqlservercentral.com/articles/Crosstab/65048/
-- build sample data
create table #temp_table(
id int,
name varchar(255),
[purchase price] decimal(10,2),
[date] smalldatetime
)
insert into #temp_table
select 3, 'tim', 20, '20140802' union all
select 3, 'tim', 25, '20140805' union all
select 4, 'joe', 25, '20140801' union all
select 4, 'joe', 25, '20140803' union all
select 4, 'joe', 25, '20140807' union all
select 1, 'bob', 25, '20140811'
declare @sql1 varchar(4000)
declare @sql2 varchar(4000)
declare @sql3 varchar(4000)
declare @max int
declare @counter int
select @counter = 1
select top 1 @max = count(*) from #temp_table group by id order by count(*) desc-- get number of columns
select @sql1 =
'select
id,
name,
'
select @sql3 =
'from(
select
*,
rn = row_number() over(partition by id, name order by [date])
from #temp_table
)t
group by id, name
order by id'
select @sql2 = ''
while @counter <= @max begin
select @sql2 =
@sql2
+ ' max(case when rn = ' + convert(varchar(10),@counter) + ' then [purchase price] else null end) as [purchase price ' + convert(varchar(10),@counter) + '],' + char(10)
+ ' max(case when rn = ' + convert(varchar(10),@counter) + ' then [date] else null end) as [date ' + convert(varchar(10),@counter) + ']'
if @counter <> @max begin
select @sql2 = @sql2 + ','
end
select @sql2 = @sql2 + char(10)
select @counter = @counter + 1
end
print (@sql1 + @sql2 + @sql3)
exec (@sql1 + @sql2 + @sql3)
drop table #temp_table
示例数据:
id name purchase price date
----------------------------------------
3 tim 20.00 2014-08-02 00:00:00
3 tim 25.00 2014-08-05 00:00:00
4 joe 25.00 2014-08-01 00:00:00
4 joe 25.00 2014-08-03 00:00:00
4 joe 25.00 2014-08-07 00:00:00
1 bob 25.00 2014-08-11 00:00:00
结果:
id name purchase price 1 date 1 purchase price 2 date 2 purchase price 3 date 3
--------------------------------------------------------------------------------------------------------------------------------------------
1 bob 25.00 2014-08-11 00:00:00 NULL NULL NULL NULL
3 tim 20.00 2014-08-02 00:00:00 25.00 2014-08-05 00:00:00 NULL NULL
4 joe 25.00 2014-08-01 00:00:00 25.00 2014-08-03 00:00:00 25.00 2014-08-07 00:00:00