oracle单表查询的问题

有一个流水明细表,字段有:部门(‘001’),日期(‘20190417’),金额(‘52462’)
我现在要查 各部门 2017,2018,2019年 每年的 合计金额,

我写的是

select a.部门, a.suma,b.sumb,c.sumc from
(select 部门, sum(金额) suma
from (select * from 表 where 日期 like '2019%')
group by 部门)a
left join
(select aab034, sum(金额) sumb
from (select * from 表 where 日期 like '2018%')
group by 部门)b
on a.部门 = b.部门
left join
(select aab034, sum(金额) sumc
from (select * from 表 where 日期 like '2017%')
group by 部门)c
on a.部门 = c.部门

但是这样太烂了,要是查每个月的话得left join 12次,求正确写法

使用下面SQL再根据使用的数据库换一下处理日期格式的函数就可以了,我用的这个是mysql的

select sum(money),dept,date_format(date,'%Y')
from tail
where dept in(10) and date_format(date,'%Y') in('2019')
group by dept,date_format(date,'%Y')

或者使用这个

select sum(money),dept,sum(CASE date when  date_format(date,'%Y')='2019' then 1 ELSE 0 END)
from tail
where dept in(10) and date_format(date,'%Y') in('2019')
group by dept

CREATE TABLE 流水明细表
(
部门 varchar2(255),
日期 varchar2(255),
金额 varchar2(255)

select b.日期, b.部门, sum(金额)
from (select a.部门, a.金额, substr(日期, 0, 4) 日期 from 流水明细表 a) b
group by b.日期, b.部门
order by 日期 desc

---------sql解析请看下图----------
图片说明

行转列

1.pivot函数 —— 11g及以后可使用

select *
  from (select 部门,to_number(substr(日期,1,4)) 年份,sum(金额) 合计金额
          from 流水明细表
         group by 部门,substr(日期,1,4)) x
 pivot (max(合计金额) for 年份 in (2017,2018,2019))
 order by 部门

2.max(decode())

select 部门,
       max(decode(年份,'2017',合计金额)) "2017",
       max(decode(年份,'2018',合计金额)) "2018",
       max(decode(年份,'2019',合计金额)) "2019"
  from (select 部门,substr(日期,1,4) 年份,sum(金额) 合计金额
          from 流水明细表
         group by 部门,substr(日期,1,4)) x
 group by 部门
 order by 部门

select 部门,substr(日期,0,4),sum(金额)
from 流水表
group by 部门,substr(日期,0,4);