高手进来看一下....急,在线等。放100分啊!!!
数据库中有个以下的表:
表1:
日期/生产量 pro1 pro2 pro3 pro4
11月1日 20 30 40 50
11月2日 28 30 45 70
11月3日 15 16 20 30
11月4日 18 20 30 4
11月5日 12 13 14 19
表2:
pro1 电脑
pro2 电视
pro3 汽车
pro4 电话
现在要转为下面的表:
产品 11月1日 11月2日 11月3日 11月4日 11月5日
电脑
电视
汽车
电话
请问怎么转换?
[解决办法]
if object_id( 'pubs..表1 ') is not null
drop table 表1
go
create table 表1(日期 varchar(10),pro1 int,pro2 int,pro3 int,pro4 int)
insert into 表1(日期,pro1,pro2,pro3,pro4) values( '11月1日 ', 20, 30, 40, 50)
insert into 表1(日期,pro1,pro2,pro3,pro4) values( '11月2日 ', 28, 30, 45, 70)
insert into 表1(日期,pro1,pro2,pro3,pro4) values( '11月3日 ', 15, 16, 20, 30)
insert into 表1(日期,pro1,pro2,pro3,pro4) values( '11月4日 ', 18 , 20, 30, 4)
insert into 表1(日期,pro1,pro2,pro3,pro4) values( '11月5日 ', 12 , 13, 14, 19)
go
if object_id( 'pubs..表2 ') is not null
drop table 表2
go
create table 表2(col1 varchar(10),col2 varchar(10))
insert into 表2(col1,col2) values( 'pro1 ', '电脑 ')
insert into 表2(col1,col2) values( 'pro2 ', '电视 ')
insert into 表2(col1,col2) values( 'pro3 ', '汽车 ')
insert into 表2(col1,col2) values( 'pro4 ', '电话 ')
go
select 产品 ,
max(case when 日期 = '11月1日 ' then value else 0 end) as '11月1日 ',
max(case when 日期 = '11月2日 ' then value else 0 end) as '11月2日 ',
max(case when 日期 = '11月3日 ' then value else 0 end) as '11月3日 ',
max(case when 日期 = '11月4日 ' then value else 0 end) as '11月4日 ',
max(case when 日期 = '11月5日 ' then value else 0 end) as '11月5日 '
from
(
select 日期 , 产品 = '电脑 ' , pro1 as value from 表1
union all
select 日期 , 产品 = '电视 ' , pro2 as value from 表1
union all
select 日期 , 产品 = '汽车 ' , pro3 as value from 表1
union all
select 日期 , 产品 = '电话 ' , pro4 as value from 表1
) t
group by 产品
drop table 表1,表2
/*
产品 11月1日 11月2日 11月3日 11月4日 11月5日
---- ----------- ----------- ----------- ----------- -----------
电话 50 70 30 4 19
电脑 20 28 15 18 12
电视 30 30 16 20 13
汽车 40 45 20 30 14
(所影响的行数为 4 行)
*/
[解决办法]
--创建测试环境
create table 表1(日期 varchar(10),pro1 int,pro2 int,pro3 int,pro4 int)
create table 表2(pro varchar(20),proname varchar(20))
--插入测试数据
insert 表1(日期,pro1,pro2,pro3,pro4)
select '11月1日 ', '20 ', '30 ', '40 ', '50 ' union all
select '11月2日 ', '28 ', '30 ', '45 ', '70 ' union all
select '11月3日 ', '15 ', '16 ', '20 ', '30 ' union all
select '11月4日 ', '18 ', '20 ', '30 ', '4 ' union all
select '11月5日 ', '12 ', '13 ', '14 ', '19 '
insert 表2(pro,proname)
select 'pro1 ', '电脑 ' union all
select 'pro2 ', '电视 ' union all
select 'pro3 ', '汽车 ' union all
select 'pro4 ', '电话 '
--求解过程
declare @sql varchar(8000) set @sql = 'select pro '
select @sql = @sql + ',sum(case when 日期 = ' ' '+日期
+ ' ' ' then num else 0 end) as [ '+日期+ '] '
from 表1
select @sql = @sql + ' from(
select 日期, ' 'pro1 ' ' as pro,pro1 as num from 表1 union all
select 日期, ' 'pro2 ' ' as pro,pro2 from 表1 union all
select 日期, ' 'pro3 ' ' as pro,pro3 from 表1 union all
select 日期, ' 'pro4 ' ' as pro,pro4 from 表1
) x group by pro '
exec ( @sql)
--删除测试环境
drop table 表1,表2
/*--测试结果
pro 11月1日 11月2日 11月3日 11月4日 11月5日
---- ----------- ----------- ----------- ----------- -----------
pro1 20 28 15 18 12
pro2 30 30 16 20 13
pro3 40 45 20 30 14
pro4 50 70 30 4 19
*/
[解决办法]
create table t1([日期/生产量] varchar(10),pro1 int,pro2 int,pro3 int,pro4 int)
insert into t1 values( '11月1日 ',20,30,40,50)
insert into t1 values( '11月2日 ',28,30,45,70)
insert into t1 values( '11月3日 ',15,16,20,30)
insert into t1 values( '11月4日 ',18,20,30, 4)
insert into t1 values( '11月5日 ',12,13,14,19)
create table t2(col varchar(8),name varchar(8))
insert into t2 values( 'pro1 ', '电脑 ')
insert into t2 values( 'pro2 ', '电视 ')
insert into t2 values( 'pro3 ', '汽车 ')
insert into t2 values( 'pro4 ', '电话 ')
go
declare @sql1 varchar(8000),@sql2 varchar(8000)
set @sql1= ' '
set @sql2= ' '
select @sql1=@sql1+ ',[ '+[日期/生产量]+ ']=sum(case date when ' ' '+[日期/生产量]+ ' ' ' then pro else 0 end) '
from t1 group by [日期/生产量]
select @sql2=@sql2+ ' union all select [日期/生产量] as date, ' ' '+name+ ' ' ' as name, '+col+ ' as pro from t1 '
from t2
set @sql1= 'select name '+@sql1+ ' from ( '+stuff(@sql2,1,11, ' ')+ ') t group by name '
exec(@sql1)
/*
name 11月1日 11月2日 11月3日 11月4日 11月5日
---- ----------- ----------- ----------- ----------- -----------
电话 50 70 30 4 19
电脑 20 28 15 18 12
电视 30 30 16 20 13
汽车 40 45 20 30 14
*/
go
drop table t1,t2
go
[解决办法]
一楼的,我顺便问一下;
如果这两个表的记录不是固定的,或者说日期 商品 数量的记录不确定该怎么写呢