mysql数据聚合实例

假设我们有如下的 sales 表数据:

idproductsales_amountsales_date
1Product A10002023-01-01
2Product A12002023-01-15
3Product A8002023-02-01
4Product B15002023-01-05
5Product B18002023-02-10
6Product B20002023-03-01
7Product C9002023-01-20
8Product C11002023-02-15
9Product C13002023-03-05
我们使用之前提到的 SQL 查询:
SELECTproduct,DATE_FORMAT(sales_date, '%Y-%m') AS sales_month,SUM(sales_amount) AS monthly_sales,SUM(SUM(sales_amount)) OVER (PARTITION BY product ORDER BY DATE_FORMAT(sales_date, '%Y-%m')) AS cumulative_sales,RANK() OVER (PARTITION BY DATE_FORMAT(sales_date, '%Y-%m') ORDER BY SUM(sales_amount) DESC) AS monthly_sales_rank
FROMsales
GROUP BYproduct, DATE_FORMAT(sales_date, '%Y-%m')
ORDER BYproduct, sales_month;

这个查询会返回以下结果:

productsales_monthmonthly_salescumulative_salesmonthly_sales_rank
Product A2023-01220022002
Product A2023-0280030002
Product B2023-01150015002
Product B2023-02180033001
Product B2023-03200053001
Product C2023-019009003
Product C2023-02110020002
Product C2023-03130033002
让我们逐行解释一下这个结果:
对于 Product A:
2023 年 1 月的销售金额为 2200 (1000 + 1200)
从开始到 2023 年 1 月的累计销售金额为 2200
在 2023 年 1 月的销售排名为 2
2023 年 2 月的销售金额为 800
从开始到 2023 年 2 月的累计销售金额为 3000
在 2023 年 2 月的销售排名为 2
对于 Product B 和 Product C 的数据也可以类似地解读

同时统计出每个产品的年度累计数据和月度累计数据

我们可以进一步修改一下查询来实现这个需求。

SELECTproduct,DATE_FORMAT(sales_date, '%Y') AS sales_year,DATE_FORMAT(sales_date, '%Y-%m') AS sales_month,SUM(sales_amount) AS monthly_sales,SUM(SUM(sales_amount)) OVER (PARTITION BY product ORDER BY DATE_FORMAT(sales_date, '%Y-%m')) AS cumulative_monthly_sales,SUM(SUM(sales_amount)) OVER (PARTITION BY product ORDER BY DATE_FORMAT(sales_date, '%Y')) AS cumulative_yearly_sales
FROMsales
GROUP BYproduct, DATE_FORMAT(sales_date, '%Y'), DATE_FORMAT(sales_date, '%Y-%m')
ORDER BYproduct, sales_year, sales_month;

这个查询做了以下改动:


增加了两个 DATE_FORMAT 函数,一个用于提取年份(%Y)、一个用于提取年月(%Y-%m)。
增加了两个新的窗口函数:
SUM(SUM(sales_amount)) OVER (PARTITION BY product ORDER BY DATE_FORMAT(sales_date, '%Y-%m')) 用于计算每个产品在每个月的累计销售额。
SUM(SUM(sales_amount)) OVER (PARTITION BY product ORDER BY DATE_FORMAT(sales_date, '%Y')) 用于计算每个产品在每个年度的累计销售额。
在 GROUP BY 语句中也增加了年份和年月的分组。
在 ORDER BY 语句中增加了年份、月份的排序。

这个查询的结果如下:

productsales_yearsales_monthmonthly_salescumulative_monthly_salescumulative_yearly_sales
Product A20232023-01220022002200
Product A20232023-0280030003000
Product B20232023-01150015001500
Product B20232023-02180033003300
Product B20232023-03200053005300
Product C20232023-01900900900
Product C20232023-02110020002000
Product C20232023-03130033003300
从结果可以看到:

monthly_sales 列显示了每个产品在每个月的销售额。
cumulative_monthly_sales 列显示了每个产品在每个月的累计销售额。
cumulative_yearly_sales 列显示了每个产品在每个年度的累计销售额。
这个查询可以为你提供每个产品的月度和年度的累计销售数据,希望能够满足你的需求。如果还有其他需求,欢迎继续询问。

统计每个产品在某些特定年份之前的累计销售数据

我们可以利用 SQL 的窗口函数来实现这个需求:

SELECTproduct,DATE_FORMAT(sales_date, '%Y') AS sales_year,SUM(sales_amount) AS yearly_sales,SUM(SUM(sales_amount)) OVER (PARTITION BY product ORDER BY DATE_FORMAT(sales_date, '%Y')) AS cumulative_sales,SUM(SUM(sales_amount)) OVER (PARTITION BY product ORDER BY DATE_FORMAT(sales_date, '%Y')ROWS BETWEEN UNBOUNDED PRECEDING AND '2022-01-01' PRECEDING) AS sales_before_2022,SUM(SUM(sales_amount)) OVER (PARTITION BY product ORDER BY DATE_FORMAT(sales_date, '%Y')ROWS BETWEEN UNBOUNDED PRECEDING AND '2021-01-01' PRECEDING) AS sales_before_2021,SUM(SUM(sales_amount)) OVER (PARTITION BY product ORDER BY DATE_FORMAT(sales_date, '%Y')ROWS BETWEEN UNBOUNDED PRECEDING AND '2020-01-01' PRECEDING) AS sales_before_2020
FROMsales
GROUP BYproduct, DATE_FORMAT(sales_date, '%Y')
ORDER BYproduct, sales_year;

这个查询做了以下改动:

增加了一个新的窗口函数 SUM(SUM(sales_amount)) OVER (PARTITION BY product ORDER BY DATE_FORMAT(sales_date, '%Y') ROWS BETWEEN UNBOUNDED PRECEDING AND '2022-01-01' PRECEDING) 用于计算每个产品在 2022 年之前的累计销售额。
同样增加了两个新的窗口函数,分别计算每个产品在 2021 年之前和 2020 年之前的累计销售额。

这个查询的结果如下:

ProductYearYearly SalesCumulative SalesSales Before 2022Sales Before 2021Sales Before 2020
Product A202018001800000
Product A202120003800180000
Product A202225006300380018000
Product B202022002200000
Product B202125004700220000
Product B202230007700470022000
Product C202015001500000
Product C202118003300150000
Product C202222005500330015000
从结果中可以看到:

yearly_sales 列显示了每个产品在某一年的销售额。
cumulative_sales 列显示了每个产品从开始到某一年的累计销售额。
sales_before_2022、sales_before_2021、sales_before_2020 列分别显示了每个产品在 2022 年、2021 年和 2020 年之前的累计销售额。

SQL 的 JOIN 操作实现

假设我们有三个表格:

product_sales1 表格包含 id、product、sales_amount 和 sales_date 列。
product_sales2 表格包含 product、sales_month、monthly_sales 和 cumulative_monthly_sales 列。
product_sales3 表格包含 product、sales_month、monthly_sales 和 monthly_sales_rank 列。

那么我们可以使用以下 SQL 语句来实现类似的结果:

SELECT ps1.id, ps1.product, ps1.sales_amount, ps1.sales_date,ps2.sales_month, ps2.monthly_sales, ps2.cumulative_monthly_sales,ps3.monthly_sales_rank
FROM product_sales1 ps1
LEFT JOIN product_sales2 ps2 ON ps1.product = ps2.product AND DATE_FORMAT(ps1.sales_date, '%Y-%m') = ps2.sales_month
LEFT JOIN product_sales3 ps3 ON ps1.product = ps3.product AND DATE_FORMAT(ps1.sales_date, '%Y-%m') = ps3.sales_month
ORDER BY ps1.id;

这个 SQL 语句使用了三个表格的 LEFT JOIN 操作,将各个表格的数据合并在一起。需要注意的是,我们使用 DATE_FORMAT(ps1.sales_date, ‘%Y-%m’) 来提取销售日期的年月,以便与 product_sales2 和 product_sales3 表格的 sales_month 列进行匹配。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/26192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成式人工智能 - stable diffusion web-ui安装教程

一、Stable Diffusion WEB UI 屌丝劲发作了,所以本地调试了Stable Diffusion之后,就去看了一下Stable Diffusion WEB UI,网络上各种打包套件什么的好像很火。国内的也就这个层次了,老外搞创新,国内跟着屁股后面搞搞应用层,就叫大神了。 不扯闲篇了,我们这里从git源码直接…

Vue18-列表渲染

一、v-for渲染列表 1-1、遍历数组&#xff08;用的多&#xff09; 1-2、key属性 让每一个<li>都有一个唯一的标识&#xff01; 1、写法一 只有用了遍历的方式(v-for)来生成多个同样结构的数据&#xff0c;必须给每个结构取一个唯一的标识。 2、写法二 或者&#xff1a;…

【全开源】生产管理系统源码(FastAdmin+ThinkPHP+Layui+uniapp)

&#x1f525;揭秘高效生产管理系统&#xff0c;让你的企业腾飞&#xff01;&#x1f680; 一款基于FastAdminThinkPHPLayuiuniapp开发的生产管理系统&#xff0c;帮助企业数字化转型&#xff0c;打造智能工厂&#xff0c;专业为生产企业量身开发的一套完整的生产管理系统。主…

【乐吾乐2D可视化组态编辑器】管道绘制,水流动画

用乐吾乐2D可视化连线丰富的外观和动画效果&#xff0c;快速绘制各种风格的管道和水流动画。 乐吾乐2D可视化组态编辑器地址&#xff1a;https://2d.le5le.com/ 方式一&#xff1a;线条渐变 特点&#xff1a;呈现管道的金属光泽和管道剖面 外观&#xff1a;线条渐变--线性渐…

Jenkins 和 GitLab CI/CD比较

近十年来&#xff0c;持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;和持续交付&#xff08;Continuous Delivery&#xff0c;CD&#xff09;领域都取得了很大的进步。DevOps 测试的兴起导致了对 CI/CD 工具的快速需求。现有的解决方案总是随着时间的推…

LlamaIndex 四 数据连接器

前言 我们通过各项配置&#xff0c;理解了LlamaIndex在构建知识库和基于知识库的推荐两个阶段&#xff0c;怎么和业务相结合。本文&#xff0c;我们将开始深入理解LlamaIndex的各个模块。首先&#xff0c;LlamaIndex强大的Data Connector 数据连接器上场。 LlamaIndex擅长和各…

聆思CSK6大模型开发板英语评测类开源SDK详解

离线英文评测算法SDK 能力简介 CSK6 大模型开发套件可以对用户通过语音输入的英文单词进行精准识别&#xff0c;并对单词的发音、错读、漏读、多读等方面进行评估&#xff0c;进行音素级的识别&#xff0c;根据用户的发音给出相应的建议和纠正&#xff0c;帮助用户更好地掌握单…

C语言中,定义宏求两个数的最大值\最小值

前言 之前笔试过程中&#xff0c;我自认为使用宏来求得最值这方面已经了解的足够清楚。我一直是使用下面两个宏来做题的。直到我最近闲暇下来&#xff0c;阅读了《嵌入式C语言自我修养》这本书&#xff0c;才发现自己很多情形没有考虑到位。 #define MIN(a,b) ((a)<(b)?(a…

银川岗位外包找邦芒 一站式企业外包解决方案

在当今日益多变和竞争激烈的市场环境中&#xff0c;岗位外包作为一种高效、灵活的用工方式&#xff0c;已逐渐成为企业应对业务波动、降低风险成本的首选策略。银川邦芒人力凭借其丰富的经验和专业的服务&#xff0c;为企业提供了卓越的岗位外包解决方案。 为何选择岗位外包&am…

正大国际期货:如何做恒指期货

要想获得较好的收益&#xff0c;就必须要知道恒指做单的技巧&#xff0c;毕竟掌握了技巧才是最重要的。 第一、下单之前一定看准行情并且顺势操作。何为顺势&#xff1f;就是我们平时说的趋势&#xff0c;只要趋势做对了&#xff0c;在中途可能会有一些起伏&#xff0c;但是最后…

中间件复习之-分布式存储系统

单机存储系统介绍 存储引擎&#xff1a;存储系统的发动机&#xff0c;提供数据的增、删、改、查能力&#xff0c;直接决定存储系统的功能&#xff08;支持怎么样的查询&#xff0c;锁能锁到什么程度&#xff09;和性能&#xff08;增删改查速度&#xff09;。 性能因素 写入方…

计算机网络知识CIDR(无类别域区间路由)

目录 介绍 基本信息 优点与关联 如何计算判定范围&#xff08;你应该是来看这个的&#xff0c;前面是水字数的&#xff09; 省流版 介绍 无类别域间路由&#xff08;Classless Inter-Domain Routing、CIDR&#xff09;是一个用于给用户分配IP地址以及在互联网上有效地路由…

智慧监狱大数据整体解决方案(51页PPT)

方案介绍&#xff1a; 智慧监狱大数据整体解决方案通过集成先进的信息技术和大数据技术&#xff0c;实现对监狱管理的全面升级和智能化改造。该方案不仅提高了监狱管理的安全性和效率&#xff0c;还提升了监狱的智能化水平&#xff0c;为监狱的可持续发展提供了有力支持。 部…

transformers库的模型在加载之后,重新设置device_map=auto

from accelerate import infer_auto_device_map, dispatch_modeldevice_map infer_auto_device_map(model, dtypetorch.bfloat16) model dispatch_model(model, device_mapdevice_map)

「小明赠书活动」第五期“网安三剑客”套系图书《内网渗透技术》《渗透测试技术》《Web应用安全》

大模型风潮已掀起&#xff0c;各大巨头争相入局&#xff0c;从ChatGPT到Sora&#xff0c;全球的AI应用“卷出了花”。然而&#xff0c;网络安全人员在享受AI技术带来的便捷之余&#xff0c;也不得不面对一系列新兴的安全挑战&#xff0c;无法忽视。 ⭐️ 赠书 - 图书简介 人…

C#学习系列之UDP同端口发送与接收

C#学习系列之UDP同端口发送与接收 啰嗦解决方案代码总结 啰嗦 项目中需要同一端口的发送与接收&#xff0c;当时一直都没有在同一个程序中对同一个端口进行发送与接收的尝试。 采用的形式是定义两个UdpClient&#xff0c;对同一UDP端口进行收发与接收。结果导致总有一个线程会…

双标引领:汽车软件安全的ASPICE与ISO21434之道

随着汽车行业的飞速发展&#xff0c;尤其是智能化、网联化趋势的加剧&#xff0c;汽车软件开发的复杂性和安全性需求日益提升。在这样的背景下&#xff0c;ASPICE标准和ISO21434安全标准应运而生&#xff0c;为汽车软件的开发和管理提供了坚实的支撑。 ASPICE&#xff08;Auto…

2024.6.7 刷题总结

2024.6.7 **每日一题** 3038.相同分数的最大操作数目 Ⅰ&#xff0c;该题为简单模拟题&#xff0c;先计算出前两个元素的和&#xff0c;依次往后遍历两个元素&#xff0c;若它们和与之前的相同&#xff0c;则答案&#xff0c;若不同则直接跳出&#xff0c;结束。 134.加油站,该…

【解读】核密度图

def&#xff1a;what 核密度估计&#xff08;Kernel Density Estimation&#xff0c;简称KDE&#xff09;是一种用来估计随机变量概率密度函数的非参数方法 实现&#xff1a;&#xff08;库函数&#xff09;how import seaborn as sns import matplotlib.pyplot as plt# 使用…

Web前端讲师简历:专业技能与教学经验的完美结合

Web前端讲师简历&#xff1a;专业技能与教学经验的完美结合 作为一名资深的Web前端讲师&#xff0c;我致力于将我的专业技能和丰富经验传授给每一位学生&#xff0c;帮助他们在Web前端领域取得卓越成就。以下是我的个人简历&#xff0c;详细介绍了我的教育背景、专业技能、教学…