一、数据准备

-- 创建表并插入数据
CREATE TABLE `saleorder`  (`order_id` int ,`order_time` date ,`order_num` int
) INSERT INTO `saleorder` VALUES
(1, '2020-04-20', 420),
(2, '2020-04-04', 800),
(3, '2020-03-28', 500),
(4, '2020-03-13', 100),
(5, '2020-02-27', 300),
(6, '2020-01-07', 450),
(7, '2019-04-07', 800),
(8, '2019-03-15', 1200),
(9, '2019-02-17', 200),
(10, '2019-02-07', 600),
(11, '2019-01-13', 300);

查看表信息

select * from saleorder;

二、占比

写法一:

基本思路:用式内连接,外加嵌套找出分子分母,相除(最后要分组)

SELECTorder_month,num,total,round( num / total, 2 ) AS ratio
FROM
(-- 月统计SELECT DATE_FORMAT(order_time,"yyyy-MM") AS order_month,sum( order_num ) AS numFROM    saleorder GROUP BYDATE_FORMAT(order_time,"yyyy-MM")
)t1,
(-- 年统计SELECT year(order_time) AS order_year,sum( order_num ) AS totalFROM saleorder GROUP BYyear(order_time)
)t2
where substr(t1.order_month,1,4) = t2.order_year;

写法二:显示内连接

基本思路:显示内联接,先分组、汇总–>笛卡尔积连接–>相除
提示: 时间处理的时候除了用date_formate()也可以用substr()函数来截取年月日格式

SELECTorder_month,num,total,round(num/total,2) as ratio
FROM
(SELECTsubstr( order_time, 1, 7 ) AS order_month,sum( order_num ) AS num FROMsaleorder GROUP BYsubstr( order_time, 1, 7 )
) t1
INNER JOIN
(SELECTsubstr( order_time, 1, 4 ) AS order_year,sum( order_num ) AS total FROMsaleorderGROUP BYsubstr( order_time, 1, 4 )
) t2
ON substr( order_month, 1, 4 ) = t2.order_year ;

写法三:开窗函数

SELECT order_month,num,total,round( num / total, 2 ) AS ratio
FROM
(select substr(order_time, 1, 7) as order_month, sum(order_num) over (partition by substr(order_time, 1, 7)) as num,sum( order_num ) over ( PARTITION BY substr( order_time, 1, 4 ) ) total,row_number() over (partition by substr(order_time, 1, 7)) as rk from saleorder
) temp
where rk = 1;

注意:

(1) 时间处理的时候除了用date_formate()也可以用substr()函数来截取年月日格式
(2)当我们求的占比分子分母没有时间维度只有数量的时候,我们可以采用on 1=1 来进行关联,构造成笛卡尔积

三、环比

与上年度数据对比称"同比",与上月数据对比称"环比"。
相关公式如下:

同比增长率计算公式
(当年值-上年值)/上年值x100% 环比增长率计算公式
(当月值-上月值)/上月值x100%

实现:

select now_month,now_num,last_num,round( (now_num-last_num) / last_num, 2 ) as ratio
FROM
(select now_month,now_num, lag( t1.now_num, 1 ) over (order by t1.now_month ) as last_num from (select substr(order_time, 1, 7) as now_month, sum(order_num) as now_num from saleorder group by substr(order_time, 1, 7) ) t1
) t2;

结果优化一下:

select now_month,now_num,last_num,-- round( (now_num-last_num) / last_num, 2 ) as ratioconcat( nvl ( round( ( now_num - last_num ) / last_num * 100, 2 ), 0 ), "%" )
FROM
(select now_month,now_num, lag( t1.now_num, 1 ) over (order by t1.now_month ) as last_num from (select substr(order_time, 1, 7) as now_month, sum(order_num) as now_num from saleorder group by substr(order_time, 1, 7) ) t1
) t2;

四、同比

与上年度数据对比称"同比",与上月数据对比称"环比"。
相关公式如下:

同比增长率计算公式
(当年值-上年值)/上年值x100% 环比增长率计算公式
(当月值-上月值)/上月值x100%

同比的话,如果每个月都齐全,都有数据lag(num,12)就ok.。我们的例子中只有19年和20年1-4月份的数据。这种特殊情况应该如何处理?

写法一:本案例进行单独处理

有4个月数据,我就lag(num,4)

select now_month,now_num,last_num,round( (now_num-last_num) / last_num, 2 ) as ratio
FROM
(select now_month,now_num, lag( t1.now_num, 4 ) over (order by t1.now_month ) as last_num from (select substr(order_time, 1, 7) as now_month, sum(order_num) as now_num from saleorder group by substr(order_time, 1, 7) ) t1
) t2;

优化:
对空值可以做一下优化处理,用到nvl()函数和lag()函数的第三个参数。

select now_month,now_num,last_num,nvl ( round( ( now_num - last_num ) / last_num, 2 ), 0 ) AS ratio
FROM
(select now_month,now_num, lag( t1.now_num, 4, 0 ) over (order by t1.now_month ) as last_num from (select substr(order_time, 1, 7) as now_month, sum(order_num) as now_num from saleorder group by substr(order_time, 1, 7) ) t1
) t2;

写法二:通用方法

基本思路:利用date_add()生成跨年时间

SELECTt1.now_month,CASE WHEN now_num IS NULL OR now_num = 0 THEN 0 ELSE now_num END now_num,CASE WHEN last_num IS NULL OR last_num = 0 THEN 0 ELSE last_num END last_num,CASE WHEN last_num IS NULL OR last_num = 0 THEN 0 ELSE round( ( now_num - last_num ) / last_num, 2 ) END ratio
FROM
(SELECTDATE_FORMAT( order_time, 'yyyy-MM' ) AS now_month,sum( order_num ) AS now_num FROMsaleorder GROUP BYDATE_FORMAT( order_time, 'yyyy-MM' )
) t1
LEFT JOIN
(SELECTDATE_FORMAT( DATE_ADD( order_time, 365 ), 'yyyy-MM' ) AS now_month,sum( order_num ) AS last_num FROMsaleorder GROUP BYDATE_FORMAT( DATE_ADD( order_time, 365 ), 'yyyy-MM' )
) AS t2 ON t1.now_month = t2.now_month;

优化:
用nvl()代替case when

SELECTt1.now_month,nvl ( now_num, 0 ) AS now_num,nvl ( last_num, 0 ) AS last_num,nvl ( round( ( now_num - last_num ) / last_num, 2 ), 0 ) AS ratio
FROM
(SELECTDATE_FORMAT( order_time, 'yyyy-MM' ) AS now_month,sum( order_num ) AS now_num FROMsaleorder GROUP BYDATE_FORMAT( order_time, 'yyyy-MM' )
) t1
LEFT JOIN
(SELECTDATE_FORMAT( DATE_ADD( order_time, 365 ), 'yyyy-MM' ) AS now_month,sum( order_num ) AS last_num FROMsaleorder GROUP BYDATE_FORMAT( DATE_ADD( order_time, 365 ), 'yyyy-MM' )
) AS t2 ON t1.now_month = t2.now_month;

HiveSql计算占比、同比、占环比相关推荐

  1. 用分析服务SSAS解决占比、同比和环比问题

    本文将介绍用分析服务SSAS如何解决占比.同比和环比三个指标. 首先理解一下这三个指标的基本概念: 占比是指当前成员的值与该成员父级的值的比率,意思是在总数中所占的比重,比如某水果商店总销售额为14, ...

  2. 窗口分析函数_10_计算组总和的占比

    计算组总和的占比 需求描述 需求:计算EMP表按照deptno分组,计算每组的SAL总和与所以记录总和中的占比 解决方法:通过每组SUM(SAL)窗口函数再除以记录总和来实现. 注: 数据库数据集SQ ...

  3. Power BI中计算同比、环比

    财务需求中经常要求计算数据的同比.环比,下面介绍如何在Power BI 中创建用来计算同比和环比的度量值(SSAS模型中同理)... 现金表中有金额,时间(时间需要连续的年月日格式),计算同比.环比. ...

  4. 计算同比、环比的一些常识性问题

    什么鬼 我想在这篇文章中说明的是在计算同比.环比的值的时候,会遇到的一些问题.这些问题如下: 环比月天数不一致 同比周数不一致 可比&全同比 在这一小节里面,我先不说上面的四个问题,我想说的是 ...

  5. java 计算百分比占比,占比和为100%

    场景:现在有数组 [10,40,0,50],计算10的百分比为10%,40为40%,0为0%,50为50%,和为100% /*** 计算元素占比** @param elementList 元素集合* ...

  6. php判断中文字符长度,JavaScript_JS判断字符串长度的5个方法(区分中文和英文),目的:计算字符串长度(英文占 - phpStudy...

    JS判断字符串长度的5个方法(区分中文和英文) 目的:计算字符串长度(英文占1个字符,中文汉字占2个字符) 方法一: String.prototype.gblen = function() { var ...

  7. 计算机公式求所占百分比,excel中计算大于或等于6000所占比率怎么求?【产值所占百分比公式】...

    EXCEL表格一列数据的百分比 =COUNTIF(H2:H23,">25")/COUNT(H2:H23) 请将H2:H23替换成你真实的数据区域 当excel表格中大于等于某 ...

  8. 用MDX进行同比及环比计算

    同比和环比计算是企业应用.电子商务应用中常用的计算方法,也是常用的数据分析手段.写这篇文章也是因为最近在学习MDX相关的一些计算方法的同时回想到原来我在项目中使用过的一些类似的,利用SQL来完成的统计 ...

  9. EasyExcel第三弹 + hutool-poi 配合使用导出较复杂Excel.xlsx + 计算增长率、同比环比、比重等

    一.回顾 继上次"动态表头easyExcel导入导出(https://blog.csdn.net/qq_37337660/article/details/114680512)", ...

  10. 计算同比和环比的区别_【数据说第三期】同比和环比数据分析时,有哪些需要注意的点?...

    [写在前面] 上期探讨了数据分析与数据增长的核心逻辑,了解了数据分析和数据增长的逻辑和大体工作流程等.([数据说第二期]数据分析与数据增长核心逻辑杂谈)'' 本期先从数据分析的一环开始,针对" ...

最新文章

  1. Apache - AH00558
  2. python【蓝桥杯vip练习题库】ADV-350珠心算测验
  3. 创业互联网公司如何搭建自己的技术框架
  4. python http协议获取对方的ip地址_http协议(一)基础知识
  5. You must install 'msgfmt' on your build machine
  6. Tree树 递归查询,显示成JSON格式
  7. Python风格总结:判断元素是否在列表中存在
  8. mongodb转mysql思路_脚本 将阿里云 mongodb数据转成mysql
  9. primefaces_Primefaces单选按钮,复选框示例
  10. java中的IO流之文件复制
  11. 年近30,我的职业回顾与思考
  12. openwrt增加内核模块的方法
  13. 打造炫酷通用的ViewPager指示器 玩转字体变色
  14. html5版本过低,你的浏览器版本过低【解决步骤】
  15. C#全局钩子参考文章
  16. 小米笔记本BIOS版本升级固件 小米笔记本Pro15.6【附下载地址】
  17. 基于Renascence架构的SQL查询引擎设计
  18. group by 为什么 distinct 效率高
  19. android 手机存储位置设置,如何将红米手机外置SD卡设定为默认存储
  20. Methods annotated with ‘@Async‘ must be overridable

热门文章

  1. Java Map集合的详解
  2. Sai Life Sciences任命COO;Affamed 在华植入首例景深延长型人工晶状体 | 医药健闻
  3. “智多星”智能手机销售网后台管理系统设计
  4. FreeRTOS学习,适用于FreeRTOS初学者,FreeRTOS整体知识框架
  5. 看完何同学的这期B站视频,我做了个决定...
  6. 飞思卡尔单片机PLL时钟总线模块
  7. Head First Statistics one 做图规则
  8. 首屏加载,与less的初始化css
  9. Kindle资源-史上最全60GB的Kindle技术电子书资源网盘打包下载
  10. Office-页码全为0的原因及解决方法