sql - 合并 SQL 查询中的行并为不同信息创建附加列

标签 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

我不知道从哪里开始。

最佳答案

这是使用动态交叉表完成的。 供引用: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/

相关文章:

sql - PostgreSQL 中基于时间戳的移动平均线

sql - 根据与先前数据的差异更新数据

mysql - sql从字段中删除点和逗号

sql-server - SQL Server 架构所有者权限

sql - 判断一行数据是否已更改的简单方法是什么?

mysql - 如何检查 MySQL 中的字段是否为空或为空?

mysql - sql mysql 最大()

sql - 我们可以将SQL中的逗号分隔列表作为参数传递吗

sql - 在 SQL 中按值范围分组

sql - T-SQL 跳过获取存储过程