有一个流水明细表,字段有:部门(‘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);