关于行列转换的——这个。。有点难!(100)

  • 主题发起人 主题发起人 zlibo
  • 开始时间 开始时间
Z

zlibo

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么写SQL语句,完成下面的转换日期 次数 金额 餐别2009-11-03 1 480 晚餐2009-11-04 1 530 晚餐2009-11-04 4 2360 午餐日期 午餐金额 午餐次数 晚餐金额 晚餐次数2009-11-03 0 0 480 12009-11-04 2360 4 530 1 是行列转换的,问题是这里的餐别是不固定的,名字是用户任意定义的,换句话说转换后的表的字段数目是不固定的,所以没有办法写case when 。。。的,还请高人指点
 
可能会麻烦点,效率也不高,但是应该可以实现!首先SELECT DISTINCT 餐别 FROM TABLE然后动态组织(CASE WHEN )现EXEC (SQL)等高手解答。
 
顶一下~楼上的,你就按你说的实现一下吧,我也是这思路,可是实现不了
 
需要写个存储过程处理,已经有很多现成的,去BAIDU或GOOGLE一下,SQL转置
 
gear1023,我找过了,没找到
 
完整版测试····用游标简便···create table t_dwq(d1 smalldatetime,d2 int,d3 money,d4 varchar(20))insert into t_dwq(d1,d2,d3,d4)select '2009-11-03',1,480,'晚餐'unionselect '2009-11-04',1,530,'晚餐'unionselect '2009-11-04',4,2360,'午餐'declare @Sql varchar(8000),@tmpfeild varchar(20),@UpSql varchar(8000)select @Sql = '',@tmpfeild = '',@UpSql = ''create table #tmp(日期 varchar(10))declare cur_tt cursor for select distinct d4 from t_dwqopen cur_ttFETCH NEXT FROM cur_tt into @tmpfeildwhile @@FETCH_STATUS = 0 begin if @Sql = '' Set @Sql = 'Alter table #tmp add '+@tmpfeild+'金额 money,'+@tmpfeild+'次数 int' else Set @Sql = @Sql + ','+@tmpfeild+'金额 money,'+@tmpfeild+'次数 int' FETCH NEXT FROM cur_tt into @tmpfeild endCLOSE cur_ttDEALLOCATE cur_ttexec(@Sql)insert into #tmp(日期) select distinct convert(varchar(10),d1,120) from t_dwq order by convert(varchar(10),d1,120)declare cur_tt cursor for select distinct d4 from t_dwqopen cur_ttFETCH NEXT FROM cur_tt into @tmpfeildwhile @@FETCH_STATUS = 0 begin Set @UpSql = 'Update a Set a.'+@tmpfeild+'金额 = isnull(b.d3,0),a.'+@tmpfeild+'次数 = isnull(b.d2,0)' + ' from #tmp a left join t_dwq b On a.日期 = b.d1 and b.d4 = '''+@tmpfeild+'''' exec(@UpSql) FETCH NEXT FROM cur_tt into @tmpfeild endCLOSE cur_ttDEALLOCATE cur_ttselect * from #tmpdrop table #tmp
 
create table meal_duty(meal_date date,meal_num number,meal_money number,meal_type varchar2(20));select meal_date, sum(decode(meal_type,'午餐',meal_money,0)) 午餐金額,sum(decode(meal_type,'午餐',meal_num,0)) 午餐次數,sum(decode(meal_type,'晚餐',meal_money,0)) 晚餐金額,sum(decode(meal_type,'晚餐',meal_num,0)) 晚餐次數from meal_dutygroup by meal_date;
 
'午餐','晚餐'只是我举的例子,具体是用户定义的,所以不能用实际的,怎么才行呀?能实现的再加100分
 
你不会用动态生成case when 。。。把下面的一条记录生成一个case when 。。。就可以了select distinct 餐别 from 表名
 
楼主···你试了我写的吗?···我给的你敢说不行?还是你看不懂??真服你了!
 
fbnc 写的是 oracle 语句吧,这样的问题就得用存储过程作了,case when 效率低
 
eloveme:不好意思呀,没仔细看,误会了,你的方法完全没问题,辛苦了,先给你五十,我再开个贴,你来领剩下的100分,我说话算数
 
后退
顶部