把上面相同RouteCode,DriveDate的Amount差入A表中
变成如下所示
RouteCode RouteName DriveDate 11 12 13
3 花 2007-10-05 65 65 10
4 草 2007-10-05 5 7 5
5 树 2007-10-05 15 13 15
3 木 2007-10-06 10 Null Null
4 石头 2007-10-06 11 Null Null
不知道该怎么做,太别是怎样做他们的对应关系
变成如下所示
RouteCode RouteName DriveDate 11 12 13
3 花 2007-10-05 65 65 10
4 草 2007-10-05 5 7 5
5 树 2007-10-05 15 13 15
3 木 2007-10-06 10 Null Null
4 石头 2007-10-06 11 Null Null
不知道该怎么做,太别是怎样做他们的对应关系
/*-- 数据测试环境 --*/
if exists (select * from dbo.sysobjects where id = object_id(N'[tb]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [tb]
GOcreate table tb(单位名称 varchar(10),日期 datetime,销售额 int)
insert into tb
select 'A单位','2001-01-01',100
union all select 'B单位','2001-01-02',101
union all select 'C单位','2001-01-03',102
union all select 'D单位','2001-01-04',103
union all select 'E单位','2001-01-05',104
union all select 'F单位','2001-01-06',105
union all select 'G单位','2001-01-07',106
union all select 'H单位','2001-01-08',107
union all select 'I单位','2001-01-09',108
union all select 'J单位','2001-01-11',109/*-- 要求结果
日期 A单位 B单位 C单位 D单位 E单位 F单位 G单位 H单位 I单位 J单位
---------- ----- ----- ----- ----- ----- ----- ---- ---- ---- ------
2001-01-01 100 0 0 0 0 0 0 0 0 0
2001-01-02 0 101 0 0 0 0 0 0 0 0
2001-01-03 0 0 102 0 0 0 0 0 0 0
2001-01-04 0 0 0 103 0 0 0 0 0 0
2001-01-05 0 0 0 0 104 0 0 0 0 0
2001-01-06 0 0 0 0 0 105 0 0 0 0
2001-01-07 0 0 0 0 0 0 106 0 0 0
2001-01-08 0 0 0 0 0 0 0 107 0 0
2001-01-09 0 0 0 0 0 0 0 0 108 0
2001-01-11 0 0 0 0 0 0 0 0 0 109
--*//*-- 常规处理方法*/
declare @sql varchar(8000)
set @sql='select 日期=convert(varchar(10),日期,120)'
select @sql=@sql+',['+单位名称
+']=sum(case 单位名称 when '''+单位名称+''' then 销售额 else 0 end)'
from(select distinct 单位名称 from tb) a
exec(@sql+' from tb group by convert(varchar(10),日期,120)')
set [11] = t.[11],
[12] = t.[12],
[13] = t.[13]
from A,
(
select RouteCode,DriveDate,
sum(case shapecode when 11 then amount else 0 end) [11],
sum(case shapecode when 12 then amount else 0 end) [12],
sum(case shapecode when 13 then amount else 0 end) [13]
from B
group by RouteCode,DriveDate
) T
where A.RouteCode = B.RouteCode and A.DriveDate = T.DriveDate
insert a select 3, '花' , '2007-10-05 00:00:00' , Null , Null , Null union all
select 4, ' 草' , '2007-10-05 00:00:00' , Null , Null , Null union all
select 5, '树' , '2007-10-05 00:00:00' , Null , Null , Null union all
select 3, '木' , '2007-10-06 00:00:00' , Null , Null , Null union all
select 4, '石头' , '2007-10-06 00:00:00' , Null , Null , Null create table b (routcode int , drivedate datetime,shapcode int ,amount int )
insert b select 3, '2007-10-05 00:00:00', 11 , 65 union all
select 4, '2007-10-05 00:00:00' , 11 , 5 union all
select 5, '2007-10-05 00:00:00' , 11 , 5 union all select
3, '2007-10-05 00:00:00' , 12 , 65 union all select
4, '2007-10-05 00:00:00' , 12 , 7 union all select
5, '2007-10-05 00:00:00', 12 , 13 union all select
3, '2007-10-05 00:00:00', 13 , 10 union all select
4, '2007-10-05 00:00:00', 13 , 5 union all select
5, '2007-10-05 00:00:00', 13 , 15 union all select
3, '2007-10-06 00:00:00' , 11 , 10 union all select
4, '2007-10-06 00:00:00', 11 , 11
update a set a1=T.a1,a2=T.a2,a3=T.a3 from (select routcode,drivedate,sum(case shapcode when 11 then amount else 0 end )as a1 ,sum(case shapcode when 12 then amount else 0 end ) as a2,sum(case shapcode when 13 then amount else 0 end) as a3 from b group by routcode,drivedate )T,A
where A.RoutCode = T.RoutCode and A.DriveDate = T.DriveDate
SELECT * FROM A create table A (routcode int , routename char(10), drivedate datetime, a1 int,a2 int ,a3 int)
insert a select 3, '花' , '2007-10-05 00:00:00' , Null , Null , Null union all
select 4, ' 草' , '2007-10-05 00:00:00' , Null , Null , Null union all
select 5, '树' , '2007-10-05 00:00:00' , Null , Null , Null union all
select 3, '木' , '2007-10-06 00:00:00' , Null , Null , Null union all
select 4, '石头' , '2007-10-06 00:00:00' , Null , Null , Null create table b (routcode int , drivedate datetime,shapcode int ,amount int )
insert b select 3, '2007-10-05 00:00:00', 11 , 65 union all
select 4, '2007-10-05 00:00:00' , 11 , 5 union all
select 5, '2007-10-05 00:00:00' , 11 , 5 union all select
3, '2007-10-05 00:00:00' , 12 , 65 union all select
4, '2007-10-05 00:00:00' , 12 , 7 union all select
5, '2007-10-05 00:00:00', 12 , 13 union all select
3, '2007-10-05 00:00:00', 13 , 10 union all select
4, '2007-10-05 00:00:00', 13 , 5 union all select
5, '2007-10-05 00:00:00', 13 , 15 union all select
3, '2007-10-06 00:00:00' , 11 , 10 union all select
4, '2007-10-06 00:00:00', 11 , 11
update a set a1=T.a1,a2=T.a2,a3=T.a3 from (select routcode,drivedate,sum(case shapcode when 11 then amount else 0 end )as a1 ,sum(case shapcode when 12 then amount else 0 end ) as a2,sum(case shapcode when 13 then amount else 0 end) as a3 from b group by routcode,drivedate )T,A
where A.RoutCode = T.RoutCode and A.DriveDate = T.DriveDate
SELECT * FROM A
declare @t table(routecode int,routename varchar(20),drivedate datetime,[11] int,[12] int,[13] int)insert into @t
select 3,'花','2007-10-05 00:00:00',Null,Null,Null
union all select 4,' 草','2007-10-05 00:00:00',Null,null,Null
union all select 5,' 树','2007-10-05 00:00:00',Null,Null,Null
union all select 3,'木 ','2007-10-06 00:00:00', Null,Null,Null
union all select 4,'石头','2007-10-06 00:00:00',Null,Null,Null
declare @b table(routecode int,drivedate datetime,shanecode int,amount int)
insert into @b
select 3,'2007-10-05 00:00:00',11,65
union all select 4, '2007-10-05 00:00:00', 11, 5
union all select 5, '2007-10-05 00:00:00', 11, 15
union all select 3, '2007-10-05 00:00:00', 12, 65
union all select 4, '2007-10-05 00:00:00', 12, 7
union all select 5, '2007-10-05 00:00:00', 12, 13
union all select 3, '2007-10-05 00:00:00', 13, 10
union all select 4, '2007-10-05 00:00:00', 13, 5
union all select 5, '2007-10-05 00:00:00', 13, 15
union all select 3, '2007-10-06 00:00:00', 11, 10
union all select 4, '2007-10-06 00:00:00', 11, 11
select routecode,drivedate,max(case shanecode when 11 then amount else null end) [11],
max(case shanecode when 12 then amount else null end) [12],
max(case shanecode when 13 then amount else null end) [13]
into #tab from @b group by routecode,drivedate
update b set b.[11]=a.[11],b.[12]=a.[12],b.[13]=a.[13] from @t b, #tab a where b.routecode=a.routecode and b.drivedate=a.drivedate
drop table #tab
select * from @t
update A
set [11] = t.[11],
[12] = t.[12],
[13] = t.[13]
from A
这种方式,象他gaojier1000那样转换,我明白列 gaojier1000那个例子,但是我不知道怎么把那些列合并,因为我的那个
表B没有哪一列数据是完全固定的
和表B中的Shape列都是动态生成的,以后可能还要改正,但是不能改存储过程
思路应该和gaojier1000的差不多那样做出来
只要添加新的ShapeCode,A表就会自动加入他的列中,所以关键是B表怎么再出现新的ShapeCode类型的怎么填入A中