求ORACLE同比环比查询语句

样表如下:

日期商品数量
2018-3-31阿莫西林1
2018-3-31阿莫西林2
2019-2-28阿莫西林3
2019-3-31阿莫西林4
2019-3-31阿莫西林5
2019-3-31阿莫西林6


想实现的效果为

日期商品本期数量环比数量同比数量
2019-3-31阿莫西林1503

因为2月份没有31号所以环比数量就是0

求SQL语句

sbeg571 发布于 2019-10-14 16:14
1min目标场景问卷 立即参与
回答问题
悬赏:4 F币 + 添加悬赏
提示:增加悬赏、完善问题、追问等操作,可使您的问题被置顶,并向所有关注者发送通知
共4回答
最佳回答
0
axingLv6专家互助
发布于2019-10-14 17:45
with temp as (
select to_date('2018-3-31','yyyy-MM-dd') as 日期,	'阿莫西林' as 商品,1 as 数量 from dual
union all
select to_date('2018-3-31','yyyy-MM-dd') as 日期,	'阿莫西林' as 商品,2 as 数量 from dual
union all
select to_date('2019-2-28','yyyy-MM-dd') as 日期,	'阿莫西林' as 商品,3 as 数量 from dual
union all
select to_date('2019-3-31','yyyy-MM-dd') as 日期,	'阿莫西林' as 商品,4 as 数量 from dual
union all
select to_date('2019-3-31','yyyy-MM-dd') as 日期,	'阿莫西林' as 商品,5 as 数量 from dual
union all
select to_date('2019-3-31','yyyy-MM-dd') as 日期,	'阿莫西林' as 商品,6 as 数量 from dual
)
select a.日期,a.商品,a.数量 本期数量,b.数量 as 环比数量,c.数量 as 同比数量 from
(
select 日期,商品,sum(数量) 数量 
from temp 
group by 日期,商品
) a
left join (
select 日期,商品,sum(数量) 数量 
from temp 
group by 日期,商品
) b on to_char(a.日期,'yyyy-MM')=to_char(add_months(b.日期,1),'yyyy-MM') and to_char(a.日期,'dd')=to_char(b.日期,'dd') and a.商品=b.商品
left join (
select 日期,商品,sum(数量) 数量 
from temp 
group by 日期,商品
) c on a.日期=add_months(c.日期,12) and a.商品=c.商品
where a.日期=to_date('2019-03-31','yyyy-MM-dd')

image.png

最佳回答
0
黄源Lv6中级互助
发布于2019-10-14 16:25
最佳回答
0
孙一Lv4见习互助
发布于2019-10-14 16:35(编辑于 2019-10-14 16:35)

SELECT A.日期,A.商品,SUM(A.数量) 数量,B.环比数量,C.同比数量

FROM 表 AS A

GROUP BY 日期,商品

LEFT JOIN 

(SELECT 日期,ADD_MONTH(日期+1) AS 日期加一个月 ,商品,SUM(数量) 环比数量

FROM 表

GROUP BY 日期,商品) AS B

ON A.日期 = B.日期加一个月

AND A.商品 = B.商品

LEFT JOIN 

(SELECT 日期,ADD_MONTH(日期+12) AS 日期加一年 ,商品,SUM(数量) 同比数量

FROM 表

GROUP BY 日期,商品) AS C

ON A.日期 = C.日期加一年

AND A.商品 = C.商品


手边没有oracle,没法测,大概率会报错……


最佳回答
0
tangjqLv5见习互助
发布于2019-10-14 16:51



 SELECT BB,

        CC, 

        lag(nvl(sum(AA),0),1) over (order by CC)   上月数量,

        CASE WHEN lag(nvl(sum(aa),0),1) over (order by cc) IS NULL THEN 0 ELSE  (nvl(sum(aa),0)-lag(nvl(sum(aa),0),1) over (order by cc))/lag(nvl(sum(aa),0),1) over (order by cc) END*100||'%' 环比增长率

 FROM (

SELECT SUM(a) AS aa ,b AS bb,to_char(c,'yyyy-mm') AS cc FROM (

SELECT 3  AS a ,

'阿莫西林'  AS b,

SYSDATE-30 AS c

FROM dual

UNION ALL

SELECT 2  AS a ,

'阿莫西林'  AS b,

SYSDATE-70 AS c

FROM dual

UNION ALL

SELECT 10  AS a ,

'阿莫西林'  AS b,

SYSDATE AS c

FROM dual

UNION ALL

SELECT 5  AS a ,

'阿莫西林'  AS b,

SYSDATE-8 AS c

FROM dual

) GROUP BY  b ,to_char(c,'yyyy-mm')

 ) GROUP BY BB,

        CC

 

 

 

 


  • 5关注人数
  • 711浏览人数
  • 最后回答于:2019-10-14 17:45
    请选择关闭问题的原因
    确定 取消
    返回顶部