SQL 复杂问题求解?
现在有一张表:
按进口日期查询: FROM DATE: 2007-01-01 TO DATE: 2007-04-01
结果为:
公司名 出口 进口
A 100 150
B 200 50
C 150 150
D 380 650
E 260 450
F 180 70
现在要求:同样按进口日期查询: FROM DATE: 2007-01-01 TO DATE: 2007-04-01
显示的结果为:
公司名 一月出口 一月进口 二月出口 二月进口 三月出口 三月出口
A 10 50 60 70 30 30
B 100 20 30 10 70 20
C 50 10 30 100 70 40
D 180 350 120 150 80 150
E 60 150 150 230 50 70
F 80 20 60 10 40 40
该怎么做呢?如果有什么地方不清楚可以联系我?谢谢了
[解决办法]
create table temp49(id varchar(10),import int ,export int,cdate datetime)
insert into temp49
select 'A ',10,50, '2007-04-01 '
union all select 'A ',60,70, '2007-02-01 '
union all select 'A ',30,30, '2007-03-01 '
union all select 'B ',100,20, '2007-01-01 '
union all select 'B ',30,100, '2007-02-01 '
union all select 'B ',70,20, '2007-03-01 '
union all select 'C ',50,10, '2007-01-01 '
union all select 'C ',30,100, '2007-02-01 '
union all select 'C ',70,40, '2007-03-01 '
union all select 'D ',180,350, '2007-01-01 '
union all select 'D ',120,150, '2007-02-01 '
union all select 'D ',80,150, '2007-03-01 '
union all select 'E ',60,150, '2007-01-01 '
union all select 'E ',150,230, '2007-02-01 '
union all select 'E ',50,70, '2007-03-01 '
union all select 'F ',80,20, '2007-01-01 '
union all select 'F ',60,10, '2007-02-01 '
union all select 'F ',40,40, '2007-03-01 '
select id,sum(import) import,sum(export) export,month(cdate) cdate into #temp
from temp49
group by id, month(cdate)
declare @sql varchar(8000)
set @sql= ' '
select @sql=@sql+ ', ' ' '+cast(cdate as varchar(10))+ '月进口 ' '=sum( case when cdate= '+cast(cdate as varchar(10))+ ' then import end), ' ' '+cast(cdate as varchar(10))+ '月出口 ' '=sum( case when cdate= '+cast(cdate as varchar(10))+ ' then export end) '
from #temp group by cdate
set @sql=stuff(@sql,1,1, ' ')
set @sql= 'select id, '+@sql+ ' from #temp group by id '
--print @sql
exec(@sql)
[解决办法]
if object_id( 'pubs..tb ') is not null
drop table tb
go
create table tb(公司名 varchar(10),出口 int,进口 int,时间 datetime)
insert into tb(公司名,出口,进口,时间) values( 'A ',10 ,50 , '2007-01-01 ')
insert into tb(公司名,出口,进口,时间) values( 'A ',60 ,70 , '2007-02-01 ')
insert into tb(公司名,出口,进口,时间) values( 'A ',30 ,30 , '2007-03-01 ')
insert into tb(公司名,出口,进口,时间) values( 'B ',100 ,20 , '2007-01-01 ')
insert into tb(公司名,出口,进口,时间) values( 'B ',30 ,10 , '2007-02-01 ')
insert into tb(公司名,出口,进口,时间) values( 'B ',70 ,20 , '2007-03-01 ')
insert into tb(公司名,出口,进口,时间) values( 'C ',50 ,10 , '2007-01-01 ')
insert into tb(公司名,出口,进口,时间) values( 'C ',30 ,100, '2007-02-01 ')
insert into tb(公司名,出口,进口,时间) values( 'C ',70 ,40 , '2007-03-01 ')
insert into tb(公司名,出口,进口,时间) values( 'D ',180 ,350, '2007-01-01 ')
insert into tb(公司名,出口,进口,时间) values( 'D ',120 ,150, '2007-02-01 ')
insert into tb(公司名,出口,进口,时间) values( 'D ',80 ,150, '2007-03-01 ')
insert into tb(公司名,出口,进口,时间) values( 'E ',60 ,150, '2007-01-01 ')
insert into tb(公司名,出口,进口,时间) values( 'E ',150 ,230, '2007-02-01 ')
insert into tb(公司名,出口,进口,时间) values( 'E ',50 ,70 , '2007-03-01 ')
insert into tb(公司名,出口,进口,时间) values( 'F ',80 ,20 , '2007-01-01 ')
insert into tb(公司名,出口,进口,时间) values( 'F ',60 ,10 , '2007-02-01 ')
insert into tb(公司名,出口,进口,时间) values( 'F ',40 ,40 , '2007-03-01 ')
go
declare @sql varchar(8000)
set @sql = 'select 公司名 '
select @sql = @sql + ' , max(case convert(varchar(7),时间,120) when ' ' ' + 月份 + ' ' ' then 出口 end) [ ' + 月份 + '月出口 ' + '] '
+ ' , max(case convert(varchar(7),时间,120) when ' ' ' + 月份 + ' ' ' then 进口 end) [ ' + 月份 + '月进口 ' + '] '
from (select distinct convert(varchar(7),时间,120) as 月份 from tb) as a
set @sql = @sql + ' from tb group by 公司名 '
exec(@sql)
drop table tb
/*
公司名 2007-01月出口 2007-01月进口 2007-02月出口 2007-02月进口 2007-03月出口 2007-03月进口
------ ------------- ------------- ------------- ------------- ------------- -----------
A 10 50 60 70 30 30
B 100 20 30 10 70 20
C 50 10 30 100 70 40
D 180 350 120 150 80 150
E 60 150 150 230 50 70
F 80 20 60 10 40 40
*/