我有一个返回大量客户结果的 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
我不知道从哪里开始。
最佳答案
这是使用动态交叉表完成的。 供引用: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
关于sql - 合并 SQL 查询中的行并为不同信息创建附加列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25794962/