专栏首页SQL实现SQL 计算累积销售额

SQL 计算累积销售额

有一张销售记录表 t_sales,它记录了公司在某个年份的销售记录。由于一些原因,目前只能看到两个字段:month 和 quantity,它们分别对应的中文描述是月份和售额。

t_sales 的数据如下:

 month  quantity  
------  ----------
     1         100
     1         300
     2         200
     3         300
     4         400
     5         300
     5         500
     6         600
     7         600
     8         600
     9         600
    10         700
    11         800
    12         900

注意,在一个月里面是可以产生多条销售记录。

现在,我们希望从这份数据中统计出「总销售额」「月销售额」「当前累积销售额」,统计的结果如下:

 月份    销售额     总销售额   月销售额   累积销售额   
------  --------  --------  ---------  --------
     1       100    6900       400       400     
     1       300    6900       400       400     
     2       200  6900       200       600     
     3       300  6900       300       900     
     4       400  6900       400       1300    
     5       300  6900       800       2100    
     5       500  6900       800       2100    
     6       600  6900       600       2700    
     7       600  6900       600       3300    
     8       600  6900       600       3900    
     9       600  6900       600       4500    
    10       700  6900       700       5200    
    11       800  6900       800       6000    
    12       900  6900       900       6900                   

解决方案

统计总销售额可以使用 SELECT SUM(quantity) FROM t_sales

统计月销售额可以使用 SELECT month,SUM(quantity) FROM t_sales GROUP BY month

统计当前累积销售额使用:

SELECT
  (SELECT
    SUM(quantity)
  FROM
    t_sales
  WHERE MONTH <= a.month) AS '累积销售额'
FROM
  t_sales a

再使用原表分别去关联这些统计结果,完整的 SQL 如下:

SELECT
  a.month AS '月份',
  a.quantity AS '销售额',
  (SELECT
    SUM(quantity)
  FROM
    t_sales) AS '总销售额',
  c.amount AS '月销售额',
  (SELECT
    SUM(quantity)
  FROM
    t_sales
  WHERE MONTH <= a.month) AS '累积销售额'
FROM
  t_sales a
  LEFT JOIN
    (SELECT
      MONTH,
      SUM(quantity) AS amount
    FROM
      t_sales
    GROUP BY MONTH) c
    ON c.month = a.month

如果使用窗口函数,整个 SQL 的实现会简洁很多。

sum(quantity)over() 统计出总销售额;

sum(quantity) over(PARTITION by month) 统计月销售额;

sum(quantity) over(order by month) 统计当前累积销售额。

具体的 SQL 如下:

SELECT
  MONTH AS '月份',
  quantity AS '销售额',
  SUM(quantity) over () AS '总销售额',
  SUM(quantity) over (PARTITION BY MONTH) AS '月销售额',
  SUM(quantity) over (
ORDER BY MONTH) AS '累积销售额'
FROM
  t_sales

本文分享自微信公众号 - SQL实现(gh_684ee9235a26),作者:zero

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SQL 行转列

    如果你想熟练写各种统计报表的 SQL,那么行转列是你绕不开的一个点,你必须得掌握它。

    白日梦想家
  • 介绍两个刷 SQL 题的网站

    其实,要刷 SQL 题,对着《SQL COOKBOOK》、《SQL 经典实例》这两本书,把所有实例从头到尾全部实现一遍就很厉害了。

    白日梦想家
  • SQL 打印一个月的日历

    在 MySQL 里面,实现日期的加减可以使用 DATE_ADD(date,INTERVAL expr unit) / DATE_SUB(date,INTERVA...

    白日梦想家
  • 001.iSCSI简介

    Internet小型计算机系统接口是一个机遇TCP/IP的协议,用于通过IP网络仿真SCSI高性能本地存储总线,从而为远程存储设备提供数据传输和管理。作为SAN...

    木二
  • 关于 Blob

    对于 Blob,前端开发中可能比较少遇到;数据库中可使用 Blob 概念,例如 Mysql 存储二进制数据的类型就是 Blob,也就是说图片可存储于数据库中,以...

    Krry
  • iSCSI存储的3种连接方式

    我们分析了iSCSI存储的系统结构,下面来看iSCSI是如何与服务器、工作站等主机设备来连接的,也就是我们如何建立一个iSCSI网络存储系统。

    py3study
  • Wolfram 部署了疫情交互式仪表板,追踪病毒最新传播情况、分享病患最新状态以及基因数据

    https://www.wolframcloud.com/obj/examples/COVID19China

    WolframChina
  • 新增搜索功能

    当文章数量太多了以后,寻找文章如果只靠标签,分类,和归档是不太容易的,尤其是对标签和分类有哪些标签,划分是否合理不清楚的话,更无法的去定位到相关的文章,所以添加...

    caoayu
  • 抢鲜体验:openGauss 安装编译过程要点及问题解决

    墨墨导读:OpenGauss1.0.0基于PostgreSQL9.2.4,支持标准的SQL92/SQL99/SQL2003/SQL2011规范,支持一主多备,目...

    数据和云
  • Canvas线条动画

     简单的Canvas动画,代码只有71行,试试吧!没有谁天生就会,用这个动画,做为你的Canvas小结。  如果你觉得我的代码还算有趣,在你的学习中能有所帮助,...

    我不是费圆

扫码关注云+社区

领取腾讯云代金券