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语句:
哈哈,问题解决了!给大家分享一下解决办法,供大家评论。
按照上面的思路,首先要创建一个视图,存放转换后的数据。
以下是创建视图的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;
此时做更新,并查询。
便可得到想要的结果:
昨天的回答不行?
select
bzdepartmentname_f,
bzdepartmentname,
createdate,
indiname,
indivalue,
‘sortno'=case indivalue
when 0 then 0 else sortno end from t_report
谢谢回答。可能我昨天晚上说的不太清楚,是C风场 01月 容量 的indivalue为0。而不是C风场01月sortno=0。
思路:1:先把每个风电场 二行的数据 转化为一行中的多列
2:再做其它操作就容易了。
嗯,行转列。