0 前言

最近做数据分析,需要求每一组内的元素的百分比以及累计百分比,实在想不出怎么使用sql实现,就先将数据导出,然后使用excel计算。趁着夜深人静的时候,思维敏捷,尝试一下使用窗口函数实现一下,天佑我也,尝试了几次,最终成功了,这里分享一下,也算抛砖引玉,如果有更好的方法,可以共同交流一下。

1 需求描述

还是以往风格,直接用表格描述需求,虚构一些数据,某公司在每个地区不同月份的销售额如下:

我们需要在表1的后面加上3列:分别是组内百分比、组内累计值和组内累计百分比。

                                                       表 1
地区 年月 销售额
A 2018/04 1000000
A 2018/05 2000000
A 2018/06 1500000
B 2018/04 1000000
B 2018/05 1600000
B 2018/06 2000000
B 2018/07 1500000
                                                        表   2
地区 年月 销售额 组内百分比 组内累积值 组内累积百分比
A 2018/04 1000000 22.22% 1000000 22.22%
A 2018/05 2000000 44.44% 3000000 66.67%
A 2018/06 1500000 33.33% 4500000 100.00%
B 2018/04 1000000 16.39% 1000000 16.39%
B 2018/05 1600000 26.23% 2600000 42.62%
B 2018/06 2000000 32.79% 4600000 75.41%
B 2018/07 1500000 24.59% 6100000 100.00%

2  需求实现

可以看出A地区3个月的销售总额为4500000,那么组内百分比分别为1000000/4500000、2000000/4500000和1500000/4500000,同理可以得到B地区的,但是在sql中怎么计算A地区和B地区的销售总额呢?可能你会想到group by一下地区,然后对每个地区销售额求和,可以求出来,但是个人觉得那样就比较繁琐了,写sql代码应该是一种享受的过程。这里我们使用窗口函数实现我们的需求:及加入一个字段sum(saleroom) over(partition by area order by area)即可。

组内累计和和组内累计百分比比较棘手,尝试了一些办法,分享一些认为比较简单的代码。

2.1 实现代码

为了呈现百分比的结果,我们使用round()函数以及concat()函数对小数结果进行处理,当然如果觉得输入结果为字符型,你也可以使用cast()函数进行转化格式:

sum(saleroom) over(partition by area order by date) ---求组内累计值
sum(saleroom) over(partition by area order by area) ---求组内总计值select *,sum(saleroom) over(partition by area order by date) aggregate_value,sum(saleroom) over(partition by area order by area) total_vale
from WN_table1;

运行结果见表3:

                                     表 3 组内累计值和组内总计
area date saleroom aggregate_value total_value
A 2018/04 1000000 1000000 4500000
A 2018/05 2000000 3000000 4500000
A 2018/06 1500000 4500000 4500000
B 2018/04 1000000 1000000 6100000
B 2018/05 1600000 2600000 6100000
B 2018/06 2000000 4600000 6100000
B 2018/07 1500000 6100000 6100000

所以,

组内百分比= saleroom / total_value

累计百分比 = aggregate_value/total_value

故得到表2格式的代码如下:

select area, date, saleroom, concat(round((saleroom /total_value)*100,2), '%') percent,aggregate_value,concat(round((aggregate_value/total_value)*100,2), '%') aggregate_percent
from(select *,sum(saleroom) over(partition by area order by date) aggregate_value,sum(saleroom) over(partition by area order by area) total_valuefrom WN_table1) t

3 总结

本文分享使用窗口函数实现一些复杂的需求,日后会陆续写一些有关窗口函数的内容,有时间的话,将窗口函数知识系列分享一些下,晚安,everyone。

窗口函数:实现组内百分比、累计值、累计百分比相关推荐

  1. 【SQL】窗口函数:求数据的整体百分比、整体累计值,组内累计值和组内累计百分比...

    〇.概述 1.所需资料 窗口函数实现组内百分比.累计值.累计百分比:https://blog.csdn.net/weixin_39751959/article/details/88828922 2.背 ...

  2. Tableau函数:实现数值累计值

    工作中经常需要看截至到当前时间完成情况,比如以自带的"示例–超市"中的销售额为例,各年度的总销售额为多少?各季度完成销售额多少?累计到二季度完成销售额多少?以自带的"示例 ...

  3. excel-vba组内离均差

    Sub 组内离均差() ' ' 组内平均值 Macro ' 宏由 zzh_my@163.com 录制,时间: 2015/11/18 ' '点名    初始化时间(s)   测量时刻    次序号  平 ...

  4. oracle中怎么用累计,oracle实现累加,累计百分比计算

    最近做数据分析,需要用到累加功能,发现强大的oracle还真有,用over(order by field) 例子: 数据表中最后一列就是累加的效果 累加sql: select t.acc_pedal_ ...

  5. oracle实现累加,累计百分比计算

    最近做数据分析,需要用到累加功能,发现强大的oracle还真有,用over(order by field) 例子: 数据表中最后一列就是累加的效果 累加sql: select t.acc_pedal_ ...

  6. SQL窗口函数-截止至某天的累计值

    窗口函数不仅能实现排序,还能实现累计功能,作用强大. 下面的例子使用窗口函数实现累计功能,看似复杂,但是其实不难,小白也能秒懂! ------------ 我是例子分界线 -------------- ...

  7. sqlserver 累计数量_用sqlserver查询累计值

    如何用SQL Server查询累计值 作者: Builder.com.cn 2006-12-11 05:34 PM 有这样一个要求,它要创建一个SQL Server查询,其中包括基于事件时刻的累计值. ...

  8. 使用SQL和Pandas计算累计百分比

    本文目录: 数据准备 MySQL 计算累计百分比 1.不分组情况 2.分组情况 Hive SQL计算累计百分比 1.不分组情况 2.分组情况 pandas计算累计百分比 1.不分组情况 cumsum函 ...

  9. MySQL查询累计值的方法

    假设有借贷记录表,字段有借入,贷出,以及记账日期.表中记录如下所示: 现在想统计某一天,或者某一时间段内,每天的借贷累总额,以及历史累计总额,比如,2021-10-07日的借贷总额是1100,1000 ...

最新文章

  1. android studio字符串转整型,Android Studio 中的FindBugs插件使用,轻松帮你发现Bug (转)...
  2. MyGeneration代码生成工具
  3. Android 识别图片二维码
  4. linux awk if 多个条件,linux shell awk 流程控制语句(if,for,while,do)详细介绍
  5. 底层实现_Java AOP的底层实现原理
  6. 干货!无需任何工具,实测macOS双开微信客户端
  7. 漫步ASP.NET MVC的处理管线
  8. KEIL C51软件安装
  9. 软件工程学习笔记(三)~顺序图模型
  10. matlab 单元数组输入,Matlab 单元数组
  11. linux 备份 网络配置,如何备份已经配置好的虚拟机linux系统的网络..._网络编辑_帮考网...
  12. 机器学习数学基础十:相关分析
  13. 【Educoder作业】※网页抓取及信息提取
  14. 《Globally and locally consistent image completion》图像修复论文解读
  15. 泰拉瑞亚服务器一直显示什么,《泰拉瑞亚》Steam联机总是掉?教你一个稳定联机方法...
  16. 三本可爱小表妹,面试小米Java技术岗经验分享(已拿offer)
  17. Windows与Linux的MYSQL UDF提权分析
  18. 花滑三周连跳_阿克塞尔三周PK四周跳 花滑女单正式进入新纪元
  19. js中获取当前点击的li标签以及li标签中a标签的id
  20. ZOJ 3591 Nim (NIM博弈+统计

热门文章

  1. 关于相对论的一个猜想——二维空间理论
  2. 校企勾结?京东被指压榨实习生:不结薪资、暴力对待、校方威胁...
  3. Android 智能遥控器源码,基于Android手机的智能遥控器设计
  4. Cesium 中的离屏渲染
  5. 曲速未来 发布:新基建下,区块链将急速发展
  6. Redis 在spring 中的应用
  7. 解决 HBuilderX 控制台报libpng warning: iCCP: cHRM chunk does not match sRGB的问题
  8. 单招考计算机一般考什么科目,单招考试考什么内容 单招都考什么科目
  9. springboot项目中favicon.ico的异常处理
  10. python绘制等值线图_Python/Matplotlib双线性插值等值线图