有这样一个表
时间(sdate) 名称(sname) 电量(sdl)
---------------------------------------------------------
2008-01-02 三峡 20
2008-01-02 三峡 30
2008-04-03 三峡 15
2008-04-04 三峡 242008-01-02 葛洲坝 22
2008-01-02 葛洲坝 33
2008-04-03 葛洲坝 14
2008-04-04 葛洲坝 26要求写一个select语句,能显示每个地区的当前日电量,当月电量和,当年电量和比如今天是2008-04-04,以三峡为例,日电量是24,月电量是(15+24=39),年电量是(30+20+15+24=89)
么查询的结果如下:
结构是这样的:单位 日电量 月电量 年电量
------------------------------------------------------------------
三峡 24 39 89
葛洲坝 26 40 95
时间(sdate) 名称(sname) 电量(sdl)
---------------------------------------------------------
2008-01-02 三峡 20
2008-01-02 三峡 30
2008-04-03 三峡 15
2008-04-04 三峡 242008-01-02 葛洲坝 22
2008-01-02 葛洲坝 33
2008-04-03 葛洲坝 14
2008-04-04 葛洲坝 26要求写一个select语句,能显示每个地区的当前日电量,当月电量和,当年电量和比如今天是2008-04-04,以三峡为例,日电量是24,月电量是(15+24=39),年电量是(30+20+15+24=89)
么查询的结果如下:
结构是这样的:单位 日电量 月电量 年电量
------------------------------------------------------------------
三峡 24 39 89
葛洲坝 26 40 95
sum(decode(to_char(sdate,'yyyymm'),to_char(sysdate,'yyyymm'),sdl,0)) month_dl,
sum(decode(to_char(sdate,'yyyy'),to_char(sysdate,'yyyy'),sdl,0)) year_dl
from a
group by sname
CREATE OR REPLACE FORCE VIEW view_table(单位, 日电量, 月电量,年电量)
AS
select sname,
sum(decode(trucn(sdate),trunc(sysdate),sdl,0)) day_dl,
sum(decode(to_char(sdate,'yyyymm'),to_char(sysdate,'yyyymm'),sdl,0)) month_dl,
sum(decode(to_char(sdate,'yyyy'),to_char(sysdate,'yyyy'),sdl,0)) year_dl
from a
group by sname
其实 下面用的to_char,也可以用trunc
select trunc(sysdate,'MM') from dual
结果
2008/5/1
select trunc(sysdate,'YYYY') from dual
结果
2008/1/1
CREATE OR REPLACE FORCE VIEW view_table(单位, 日电量, 月电量,年电量)
AS
select sname,
sum(decode(trucnc(sdate),trunc(sysdate),sdl,0)) day_dl,
sum(decode(to_char(sdate,'yyyymm'),to_char(sysdate,'yyyymm'),sdl,0)) month_dl,
sum(decode(to_char(sdate,'yyyy'),to_char(sysdate,'yyyy'),sdl,0)) year_dl
from a
group by sname
create or replace view v_dltj asselect name,
(
select nvl(dliang,0) from hdbalanceddjh
where to_char(hddate ,'yyyy-mm-dd')=to_char((sysdate-1),'yyyy-mm-dd')
and a.name = name
) as day,
(
select sum(nvl(dliang,0)) from hdbalanceddjh
where to_char(hddate ,'yyyy-mm')=to_char((sysdate-1),'yyyy-mm')
and a.name = name
) as month,
(
select sum(nvl(dliang,0)) from hdbalanceddjh
where to_char(hddate ,'yyyy')=to_char((sysdate-1),'yyyy')
and a.name = name
) as year
from hdbalanceddjh a
where name in ('三峡','葛洲坝','隔河岩','丹江','阳逻三期','水布垭','襄樊','荆门','姚孟','姚孟二厂','沁北','邙山','三门峡','多宝山','丰鹤','周湾','五强溪','三板溪','湘潭','金竹山','丰城','黄金埠','二滩')
group by name
sum(decode(to_char(sdate,'yyyymm'),to_char(sysdate,'yyyymm'),sdl,0)) month_dl,
判断条件 to_char(sdate,'yyyymm') 每条纪录取到月
如果=to_char(sysdate,'yyyymm') 当前月,输出sdl
默认(即不等于),输出0外面再用sum+一下,就是当月的汇总
2008-01-02 三峡 30
2008-04-03 三峡 15
2008-04-04 三峡 24
取你这段数据,来做演示,假设现在日期为4月4日
SUM以前用decode产生的select 日期,地区,
decode(trucnc(sdate),trunc(sysdate),sdl,0) 日,
decode(to_char(sdate,'yyyymm'),to_char(sysdate,'yyyymm'),sdl,0) 月,
decode(to_char(sdate,'yyyy'),to_char(sysdate,'yyyy'),sdl,0) 年
from a 日期 地区 日 月 年
2008-01-02 三峡 0 0 20 日不等于当前日,输出0,月不等于,输出0,年等于,输出20
2008-01-02 三峡 0 0 30 日不等于当前日,输出0,月不等于,输出0,年等于,输出30
2008-04-03 三峡 0 15 15 日不等于当前日,输出0,月等于,输出15,年等于,输出15
2008-04-04 三峡 24 24 24 日等于当前日,输出24,月等于,输出24,年等于,输出24 然后再SUM一下,日就是24,月就是39,年就是89