首页 新闻 会员 周边

求一条SQL语句思路

0
悬赏园豆:20 [已解决问题] 解决于 2013-12-21 17:46
create table t_report (bzdepartmentname_f nvarchar2(10),bzdepartmentname nvarchar2(10),
createdate nvarchar2(5),indiname nvarchar2(5),indivalue number,sortno number);

insert into t_report(bzdepartmentname_f,bzdepartmentname,createdate,indiname,indivalue,sortno)
values('公司1','A风电场','01','发电量',1021,0);
insert into t_report(bzdepartmentname_f,bzdepartmentname,createdate,indiname,indivalue,sortno)
values('公司1','A风电场','01','容量',81000,0);
insert into t_report(bzdepartmentname_f,bzdepartmentname,createdate,indiname,indivalue,sortno)
values('公司1','B风电场','01','发电量',2014,1);
insert into t_report(bzdepartmentname_f,bzdepartmentname,createdate,indiname,indivalue,sortno)
values('公司1','B风电场','01','容量',139500,1);
insert into t_report(bzdepartmentname_f,bzdepartmentname,createdate,indiname,indivalue,sortno)
values('公司1','C风电场','01','发电量',0,2);
insert into t_report(bzdepartmentname_f,bzdepartmentname,createdate,indiname,indivalue,sortno)
values('公司1','C风电场','01','容量',49500,2);



insert into t_report(bzdepartmentname_f,bzdepartmentname,createdate,indiname,indivalue,sortno)
values('公司1','A风电场','02','发电量',801,0);
insert into t_report(bzdepartmentname_f,bzdepartmentname,createdate,indiname,indivalue,sortno)
values('公司1','A风电场','02','容量',81000,0);
insert into t_report(bzdepartmentname_f,bzdepartmentname,createdate,indiname,indivalue,sortno)
values('公司1','B风电场','02','发电量',1851,1);
insert into t_report(bzdepartmentname_f,bzdepartmentname,createdate,indiname,indivalue,sortno)
values('公司1','B风电场','02','容量',139500,1);
insert into t_report(bzdepartmentname_f,bzdepartmentname,createdate,indiname,indivalue,sortno)
values('公司1','C风电场','02','发电量',1570,2);
insert into t_report(bzdepartmentname_f,bzdepartmentname,createdate,indiname,indivalue,sortno)
values('公司1','C风电场','02','容量',99000,2);

select * from t_report t;

 

下表描述的是一个公司的各个风电场(A、B、C)每个月(01、02)的容量。容量值取决于该风场该月的容量。要求当发电量为0的时候,容量取值也为0。比如图中红色框中的两条记录,描述的是C风场1月份的发电量跟容量。根据规则,C风场1月的发电量为0,容量值取值应该为0。求一条SQL语句思路。

 

以下是建表的SQL语句:

 

cxiaoluab的主页 cxiaoluab | 初学一级 | 园豆:26
提问于:2013-12-19 10:53
< >
分享
最佳答案
0

cxiaoluab | 初学一级 |园豆:26 | 2013-12-20 11:16

哈哈,问题解决了!给大家分享一下解决办法,供大家评论。

按照上面的思路,首先要创建一个视图,存放转换后的数据。

以下是创建视图的SQL语句。

create or replace view
 vw_monreport as
 
 select tt.bzdepartmentname_f,
               tt.bzdepartmentname,
               tt.createdate,
               sum(decode(tt.indiname, '发电量', tt.indivalue, 0)) 发电量,
               sum(decode(tt.indiname, '容量', tt.indivalue, 0)) 容量
          from (select t.bzdepartmentname_f,
                       t.bzdepartmentname,
                       t.createdate,
                       t.indiname,
                       t.indivalue
                  from t_report t
                
                ) tt
         group by tt.bzdepartmentname_f, tt.bzdepartmentname, tt.createdate
         order by tt.createdate;

查询视图,可得到如下结果:

 

此时Update,会报ORA-01732。需要创建触发器解决。以下是创建触发器的SQL语句:

 

 

create or replace trigger tr_vw_monreport
  instead of update on vw_monreport
  for each row
declare
begin
  update t_report
     set indivalue = :new.容量
   where bzdepartmentname_f = :new.bzdepartmentname_f
     and bzdepartmentname = :new.bzdepartmentname
     and createdate = :new.createdate
     and indiname = '容量';

end;


此时做更新,并查询。

 

update vw_monreport set 容量=0 where 发电量=0;
select * from t_report t;
select * from vw_monreport ;

便可得到想要的结果:

 

 

 

 

cxiaoluab | 园豆:26 (初学一级) | 2013-12-21 17:09
其他回答(2)
0

昨天的回答不行?

select

bzdepartmentname_f,

bzdepartmentname,

createdate,

indiname,

indivalue,

‘sortno'=case indivalue

when 0 then 0 else sortno end  from t_report

收获园豆:10
拾梦小侠ด้้้ | 园豆:713 (小虾三级) | 2013-12-19 12:13

谢谢回答。可能我昨天晚上说的不太清楚,是C风场 01月 容量 的indivalue为0。而不是C风场01月sortno=0。

支持(0) 反对(0) cxiaoluab | 园豆:26 (初学一级) | 2013-12-19 12:56
0

思路:1:先把每个风电场 二行的数据 转化为一行中的多列

   2:再做其它操作就容易了。

收获园豆:10
Albert Fei | 园豆:2102 (老鸟四级) | 2013-12-20 13:08

嗯,行转列。

支持(0) 反对(0) cxiaoluab | 园豆:26 (初学一级) | 2013-12-21 10:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册