合并SQL查询中的行并为不同的信息创建其他列

时间:2014-09-11 18:49:03

标签: sql sql-server

我有一个返回大量客户结果的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

我不知道从哪里开始。

1 个答案:

答案 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