精华内容
下载资源
问答
  • MySQL 计算同比环比

    2021-01-15 21:03:20
    使用 case when 语句计算这张联合表相应列的比值, 即为同比环比数据 实际语句示例: # 计算同比 select s1.id,currDate,currSum currSumFee,prevDate,prevSum prevSumFee, CASE WHEN prevSum>0 THEN (currSum-...

    主要思路 :

    1. 分别查询出上月的数据为一张表, 本月的数据为一张表
    2. 使用 left join 连接两张表, 并使用 where 语句酾浚符合条件的数据行
    3. 使用 case when 语句计算这张联合表相应列的比值, 即为同比环比数据

    实际语句示例:

    # 计算同比
    select s1.id,currDate,currSum currSumFee,prevDate,prevSum prevSumFee,
    CASE WHEN prevSum>0 THEN (currSum-prevSum)/prevSum
         ELSE "同期没有数据" END 费用同比  
    from 
    (select id ,statistic_date currDate,sum(totalFee) currSum 
    from billing_statistics where  date_format(statistic_date,'%Y-%m') = '2020-11'  group by id ) s1 
    left join
    (select id ,statistic_date prevDate,sum(totalFee) prevSum 
    from billing_statistics where  date_format(statistic_date,'%Y-%m') = '2019-11'  group by id ) s2
    on  s1.id=s2.id group by s1.id
    

    说明:

    1. 其中 currSum 为本期数据, prevSum为上期数据
    2. FORMAT((currSum-prevSum)/prevSum*100,2) 为保留小数点后两位有效数字
    3. CONCAT(FORMAT((currSum-prevSum)/prevSum*100,2),’%’) 为拼接函数
    4. 如果使用 FORMAT或 CONCAT函数, 该列数据类型自动被转为 varchar 类型, 如果需要按照 double类型大小排序, 建议不使用以上两个函数, 同时将 case when 语句中 的 ELSE “同期没有数据” 改为 ELSE 0

    参考:

    sql语句下的同比,环比操作

    MySQL 计算环比(同比类似)

    展开全文
  • mysql计算同比环比

    2020-05-21 20:50:11
    sql 计算同比环比 – 同比 SELECT t1.now_year AS 年份, t1.now_month AS 月份, CASE WHEN now_month_num IS NULL OR now_month_num = 0 THEN 0 ELSE now_month_num END 本月销售量, CASE WHEN last_month_num IS ...

    使用mysql 来 计算同比和环比

    – 同比
    SELECT
    t1.now_year AS 年份,
    t1.now_month AS 月份,
    CASE

    WHEN now_month_num IS NULL
    OR now_month_num = 0 THEN
    0 ELSE now_month_num
    END 本月销售量,
    CASE

    WHEN last_month_num IS NULL
    OR last_month_num = 0 THEN
    0 ELSE last_month_num
    END 去年同期销售量,
    CASE

    WHEN last_month_num IS NULL
    OR last_month_num = 0 THEN
    0 ELSE
    round(( now_month_num - last_month_num ) / last_month_num ,2)
    END 月订单量同比
    FROM(SELECT DATE_FORMAT(a.date, ‘%Y’ ) AS now_year,DATE_FORMAT(a.date, ‘%Y-%m’ ) AS now_month,sum( a.num ) AS now_month_num FROM yearmonth AS a GROUP BY a.date) t1
    LEFT JOIN (
    SELECT
    DATE_FORMAT( DATE_ADD( b.date, INTERVAL 1 year ), ‘%Y-%m’ )
    AS now_month,
    sum( b.num ) AS last_month_num
    FROM
    yearmonth b
    GROUP BY
    b.date
    ) AS t2 ON t1.now_month = t2.now_month;

    – 环比

    SELECT
    t1.now_year AS 年份,
    t1.now_month 月份,
    CASE

    WHEN now_month_num IS NULL
    OR now_month_num = 0 THEN
    0 ELSE now_month_num
    END 本月订单量,
    CASE

    WHEN last_month_num IS NULL
    OR last_month_num = 0 THEN
    0 ELSE last_month_num
    END 上个月订单量,
    CASE

    WHEN last_month_num IS NULL
    OR last_month_num = 0 THEN
    0 ELSE
    ( CONVERT ( ( ( now_month_num - last_month_num ) / last_month_num ) * 100, DECIMAL ( 10, 2 ) ) )
    END 月订单量环比
    FROM
    (
    SELECT
    DATE_FORMAT( a.date, ‘%Y’ ) AS now_year,
    DATE_FORMAT( a.date, ‘%Y-%m’ ) AS now_month,
    sum( a.num ) AS now_month_num
    FROM
    yearmonth AS a
    GROUP BY
    a.date
    ) t1
    LEFT JOIN (
    SELECT
    DATE_FORMAT( DATE_ADD( b.date, INTERVAL 1 MONTH ), ‘%Y-%m’ )
    AS now_month,
    sum( b.num ) AS last_month_num
    FROM
    yearmonth b
    GROUP BY
    b.date
    ) AS t2 ON t1.now_month = t2.now_month;
    – round() 优化
    SELECT
    t1.now_year AS 年份,
    t1.now_month 月份,
    CASE

    WHEN now_month_num IS NULL
    OR now_month_num = 0 THEN
    0 ELSE now_month_num
    END 本月订单量,
    CASE

    WHEN last_month_num IS NULL
    OR last_month_num = 0 THEN
    0 ELSE last_month_num
    END 上个月订单量,
    CASE

    WHEN last_month_num IS NULL
    OR last_month_num = 0 THEN
    0 ELSE
    round(( now_month_num - last_month_num ) / last_mont
    自己建测试库

    展开全文
  • 稍加分析可知,这是一道典型的求同比环比类型的题目。 知识点梳理 同比一般情况下是今年第n月与去年第n月比。同比发展速度主要是为了消除季节变动的影响,用以说明本期发展水平与去年同期发展水平对比而达到的...

    真题回顾

    博主的一位朋友今天去面试,题目是这样的。有一张表,里面有三个字段,分别为datetime,city,order,要求计算出2017年10月1日每个城市订单数量与上周同一天的比值。稍加分析可知,这是一道典型的求同比、环比类型的题目。
    在这里插入图片描述

    知识点梳理

    同比一般情况下是今年第n月与去年第n月比。同比发展速度主要是为了消除季节变动的影响,用以说明本期发展水平与去年同期发展水平对比而达到的相对发展速度。如,本期2月比去年2月,本期6月比去年6月等。其计算公式为:同比发展速度的公式应该改成:同比发展速度=本期发展水平/去年同期水平×100%;同比增长速度=(本期发展水平-去年同期水平)/去年同期水平×100%。在实际工作中,经常使用这个指标,如某年、某季、某月与上年同期对比计算的发展速度,就是同比发展速度。

    同比增长率=(本期数-同期数)/|同期数|×100%
    

    环比,表示连续2个统计周期(比如连续两月)内的量的变化比。
    环比增长率=(本期数-上期数)/上期数×100%。 反映本期比上期增长了多少;环比发展速度,一般是指报告期水平与前一时期水平之比,表明现象逐期的发展速度。

    环比增长率=(本期数-上期数)/上期数×100%
    

    DATE_SUB() 函数从日期减去指定的时间间隔。

    DATE_SUB(date,INTERVAL expr type)
    date 参数是合法的日期表达式;expr 参数是您希望添加的时间间隔;type 参数可以是下列值:YEAR、MONTH、WEEK、DAY、HOUR等等。

    实例
    假设我们有如下的表:
    在这里插入图片描述
    现在,我们希望从 “OrderDate” 减去 2 天。

    我们使用下面的 SELECT 语句:

    SELECT OrderId,DATE_SUB(OrderDate,INTERVAL 2 DAY) AS OrderPayDate FROM Orders;
    

    结果
    在这里插入图片描述

    真题详解

    1.创建数据表

    create table job_interview (datetime date,city varchar(10),orderId varchar(10));
    

    2.插入模拟数据

    insert into job_interview (datetime,city,orderId) values (20190924,'Beijing','123a'),(20190924,'Beijing','123b'),(20190924,'Beijing','123c');
    insert into job_interview (datetime,city,orderId) values (20190924,'Shanghai','123a'),(20190924,'Shanghai','123b'),(20190924,'Shanghai','123c'),(20190924,'Shanghai','123d');
    insert into job_interview (datetime,city,orderId) values (20190917,'Beijing','123a'),(20190917,'Beijing','123b');
    insert into job_interview (datetime,city,orderId) values (20190917,'Shanghai','123a'),(20190917,'Shanghai','123b');
    insert into job_interview (datetime,city,orderId) values (20190224,'Beijing','123c');
    insert into job_interview (datetime,city,orderId) values (20190224,'Shanghai','123c');
    

    在这里插入图片描述
    3.书写sql

    <case 1>
    select distinct city,count(case when datetime='20190924' then orderId else null end) over (partition by city) / count(case when datetime=date_sub('20190924',interval 1 week) then orderId else null end) over (partition by city) as '比例' from job_interview;
    

    在这里插入图片描述

    <case 2>
    select city,count(case when datetime='20190924' then orderId else null end) / count(case when datetime=date_sub('20190924',interval 1 week) then orderId else null end)  as '比例' from job_interview group by city;
    

    在这里插入图片描述

    结束语

    以上内容简单地把环比的情况进行了说明,如果能够看懂以上内容,那么环比增长率就比较简单了。相应地,同比计算也是如此,比较简单。当然,可能博主水平有限,如果大家有什么比较好的方法,也可以留言哦。我很早就建立了一个微信交流群,里面都是数据行业的从业者,有数据开发、数据分析、数据仓库、BI、数据运营等等。讨论交流的内容涉及很广,如Python、Hadoop、Hive、Oracle、Mysql、Spark等等,欢迎大家加我微信,博主带你进群。加微信请备注:微信交流群字样。谢谢~祝大家开心快乐每一天!

    在这里插入图片描述

    展开全文
  • Mysql计算同比环比(超详细)

    千次阅读 热门讨论 2020-09-11 20:52:17
    2、在mysql中新建表 表1:订单明细表 sales sql如下 CREATE TABLE sales ( `产品ID` int NOT NULL, `销售数量` int(20) , `销售时间` timestamp(6) NULL DEFAULT NULL, PRIMARY KEY (`订单ID`) ) INSERT ...

    1、首先观察两个表的格式

    表1、销售明细

     

    表2、产品明细

    2、在mysql中新建表

    表1:订单明细表 sales

    sql如下

    CREATE TABLE sales  (
      `产品ID` int NOT NULL,
    	  `销售数量` int(20) ,
      `销售时间` timestamp(6) NULL DEFAULT NULL,
      PRIMARY KEY (`订单ID`) 
    )
    INSERT INTO sales VALUES ('C1001', 15, '2020-06-01 10:10:12');
    INSERT INTO sales VALUES ('C1002',26, '2020-05-02 0:10:12');
    INSERT INTO sales VALUES ('C1003', 21, '2020-04-03 0:10:12');
    INSERT INTO sales VALUES ('C1003', 23, '2020-04-04 0:10:12');
    INSERT INTO sales VALUES ('C1003', 0, '2020-03-05 0:10:12');
    INSERT INTO sales VALUES ('C1001', 16, '2020-02-06 3:0:12');
    INSERT INTO sales VALUES ('C1002', 32, '2020-01-07 0:10:12');
    INSERT INTO sales VALUES ('C1001', 16, '2019-12-08 0:12:24');
    INSERT INTO sales VALUES ('C1001', 32, '2019-06-09  0:12:24');
    INSERT INTO sales VALUES ('C1002', 17, '2019-05-09 0:12:24');
    

    数据预览:

     

    表2:产品表 product

    sql 如下:

    CREATE TABLE product  (
      `产品ID` varchar(20) NOT NULL,
    	  `产品名称` varchar(20) ,
      `产品单价` int (10)
    )
    INSERT INTO product VALUES ('C1001','产品A',45);
    INSERT INTO product VALUES ('C1002','产品B',52);
    INSERT INTO product VALUES ('C1003','产品C',39);
    

    预览

    3、计算同比环比

    sql如下:

    select  year(c.销售时间) yy,month(c.销售时间) mm,     
           sum(c.销售数量*d.产品单价) ss,
    concat(ifnull(abs(round((sum(c.销售数量*d.产品单价)-ss1)/ss1*100,2)),0),'%') 同比,
    concat(ifnull(abs(round((sum(c.销售数量*d.产品单价)-ss2)/ss2*100,2)),0),'%')  环比
    from sales c
    left join product d on c.产品ID=d.产品ID
    left join (select month(a.销售时间) mm1,
                        year(a.销售时间) yy1,
                        sum(a.销售数量*d.产品单价) ss1
              from sales a
              left join product d on a.产品ID=d.产品ID
              GROUP BY mm1,yy1) a
              on month(c.销售时间) = a.mm1 
              and a.yy1 = year(c.销售时间)-1	 
     left join  (select month(a.销售时间) mm2,
                        year(a.销售时间) yy2,
                        sum(a.销售数量*d.产品单价) ss2
                 from sales a
    		     left join product d on a.产品ID=d.产品ID
                  GROUP BY mm2,yy2) b
    on (b.yy2 = year(c.销售时间) and b.mm2+1 = month(c.销售时间) OR (yy2=year(c.销售时间)-1 
    AND b.mm2 = 12 AND month(c.销售时间) = 1))
     group by yy, mm
     order by yy,mm asc
    

    sql解析:

    select  year(c.销售时间) yy,month(c.销售时间) mm,     
           sum(c.销售数量*d.产品单价) ss,
    
    # concat函数,mysql字符串拼接,因为同比和环比都是百分数
    # ifnull函数,mysql判断字段是否为空,为空则为0
    # abs函数,mysql取绝对值,因为我这里取的都是正数
    # round函数,mysql保留几位小数
    concat(ifnull(abs(round((sum(c.销售数量*d.产品单价)-ss1)/ss1*100,2)),0),'%') 同比,
    concat(ifnull(abs(round((sum(c.销售数量*d.产品单价)-ss2)/ss2*100,2)),0),'%')  环比
    from sales c
    left join product d on c.产品ID=d.产品ID
    
    # 上一年销售额
    left join (select month(a.销售时间) mm1,
                        year(a.销售时间) yy1,
                        sum(a.销售数量*d.产品单价) ss1
              from sales a
              left join product d on a.产品ID=d.产品ID
              GROUP BY mm1,yy1) a
              # 同比月份相同,年份减1
              on month(c.销售时间) = a.mm1   
              and a.yy1 = year(c.销售时间)-1	
    
    # 今年销售额 
     left join  (select month(a.销售时间) mm2,
                        year(a.销售时间) yy2,
                        sum(a.销售数量*d.产品单价) ss2
                 from sales a
    		     left join product d on a.产品ID=d.产品ID
                  GROUP BY mm2,yy2) b
              # 环比取数考虑到为一月的情况
    on (b.yy2 = year(c.销售时间) and b.mm2+1 = month(c.销售时间) OR (yy2=year(c.销售时间)-1 
    AND b.mm2 = 12 AND month(c.销售时间) = 1))
     group by yy, mm
     order by yy,mm asc
    

     运行结果如下:

    结果测试:

    温馨提示:

       由于mysql在规则上和函数上与Oracle等也有些差异,列如:函数、大小写、别名的情况都可能导致出现sql执行的结果出现问题,所以在套用的时候需要细心一点。

    除此之外,还要计算累计销售

    sql如下:

    select year(销售时间) yy,month(销售时间) mm,
    sum(销售数量*b.产品单价) over(order by year(销售时间) ,month(销售时间) ) 累计数量 
    from sales a
    left join product b on a.产品ID=b.产品ID
    order by  yy,mm
    

       查看了一些资料,感觉环比同比还是不太好写,今天总结整理一下。

     

     

    展开全文
  • MySQL计算环比同比(年、月、季度)

    万次阅读 多人点赞 2019-08-06 12:50:46
    MySQL计算环比同比(年、月、季度) 环比 所谓“环比”即连续2个单位周期(比如连续两月)内的量的变化比。如今年8月比今年7月。 当然这里的单位不一定是月,可以是任何时间单位。 环比增长率=(本期数-上期数)/...
  • MySQL统计同比环比SQL

    万次阅读 2018-03-05 14:23:49
    大体思路:MySQL没有类似oracle方便的统计函数,只能靠自己去硬计算:通过时间字段直接增加年份、月份,然后通过left join关联时间字段去计算环比同比公式即可原始表结构:求同比SQL:-- 按年同比 SELECT t5.*, ...
  • mysql实现同比环比计算

    千次阅读 2019-07-25 23:15:08
    同比: select t5.m,FORMAT(((t5.newhan-t5.oldhan)/t5.oldhan)*100,2) from ( select t3.month as m,t3.avg_han as newhan,t2.avg_han1 as oldhan from (select date_format(time, '%Y-%m') as month,avg(han) ...
  • MySQL 计算环比同比类似)

    万次阅读 2018-11-06 10:10:17
    计算上海市某企业(WATER_METER_ID = 592)在2018.1.1到2018.11.5每个月的用水量,上个月的用水量以及月环比。 1.查看库表 SELECT  *  FROM  data_deal_day  WHERE  WATER_METER_ID = 592 备注:DATA_DATE...
  • 不晓得大家会不会需要看按照日期进行同比环比的例子,因为思路基本是确定的:1、获取当前值;2、获取同期值;3、获取环期值;4、进行环比同比的计算。 以下是代码,ru'guo
  • 第一部分,基础:常见日期(date)时间(time)函数的使用 1、获取当前日期时间 select now()        【2019-06-22 22:22:23 】 返回当前日期时间,受set timestamp影响 select sysdate() &...
  • 新课限时福利 限时福利1:原价 129 元,今日特价仅需 69 元!(7月前课程更新完毕)! ... 限时福利2:购课进答疑群专享柳峰... 为什么需要掌握高性能的MySQL实战? 由于互联网产品用户量大、高...
  • 各位小伙伴,在数据分析中,我们会经常用到同比环比。那么学习了python以后,如何来通过Python Pandas来计算呢?这里废话不多说,直接上干货-代码!第一步:生成测试数据#生成测试数据 import pandas as pd import...
  • 计算同比环比时需要用到本日、本月1日、上月本日、上月1日,年初 及去年对应的时间 select CURDATE() as cur_day, DATE_FORMAT(CURDATE(),'%Y-%m-01') as cur_month_first_day, DATE_SUB(CURDATE(),INTERVAL ...
  • 现在创建了视图a_date和视图b_date,求环比和同比。 视图a_date INSERT INTO `a_date`(`date`, `feiyong`) VALUES ('2017-09-01', 57557.50); INSERT INTO `a_date`(`date`, `feiyong`) VALUES ('2017-10-01', ...
  • 思路,获取今月上月想要查询的信息做连接查询,把子查询作为连接查询的联表,然后计算出相应的同比环比,注意同比环比的公式对应的条件,同时把数据字段中为空的信息给删掉 CASE WHEN: 类似分支条件 TRUNCATE...
  • 窗口函数:计算环比和同比

    千次阅读 2019-03-27 12:45:47
    0 前言 环比,表示连续2个单位周期(比如连续两月)内的量的... 同比一般情况下是今年第n月与去年第n月比,用以说明本期发展水平与去年同期发展水平对比而达到的相对发展速度,计算公式:同比增长速度=(本期发展...
  • MySql按周,按月,按日分组统计数据 <!-- 按日查询 --> SELECT DATE_FORMAT(created_date,'%Y-%m-%d') as time,sum(money) money FROM o_finance_detail where org_id = 1000 GROUP BY time <!-- 按月...
  • Hive计算环比同比

    千次阅读 2019-12-17 13:58:24
    -- (本周期 - 上周期) / 上周期 select date_time ...,(val-val7)/val7 as `周同比` from ( select date_time ,val ,lag(val,1) over(order by date_time) as val1 ,lag(val,7) over(order b...
  • SQL计算环比、周同比

    千次阅读 2019-11-10 20:43:45
    计算环比、周同比 范例表格如下: 这是面试问到的一个问题,回来学习之后了解可以用这个函数: 代码如下: select date,gmv,(gmv-gmv_1)/gmv_1,(gmv-gmv_7)/gmv_7 from (select date,gmv, lead(gmv,1) over...
  • 如图可看出,就是每月的总交易量的一个统计,再计算同比环比。 在网上看了很多,都说用left join,刚开始也是学着用。现在总结的话,就 要想清楚,为什么用left join ? 打个比方,如果客户选择2017-04 至...
  • mysql:一条sql语句统计环比同比

    万次阅读 2019-01-07 11:10:33
    统计各个景区的入园人数、销售额以及入园人数销售额的同比 以月度为例子同比为例;环比类似 思路分析:表a首先统计出当月的入园人数、销售额,表b统计出同期的入园人数、销售额(在a的基础上减去一年,可),...
  • sql语句下的同比环比操作

    千次阅读 多人点赞 2020-07-01 00:44:26
    需求:查询2020年,每月的销售额,以及同比环比,并按照年月进行升序排序 建数据库 建表 插入数据 偷个懒,这些语句就先省略了 给看个截图 ps: 建表时时间要选择datetime ,后面要对时间进行操作的~ 思路:分步操作 ...
  • 在一些提供了开窗函数的数据库中(如Oracle、Hive),可以利用lag()、lead()函数配合over(),非常方便的实现同比和环比的查询。 大家知道,ClickHose目前是没有提供对应的over()函数的,但是借助一些特殊的函数,也能...
  • MySQL-查询指定时间段数据,近7天、指定季度、年度数据 业务需求需要查询指定时间段数据,特此记录,有更优时则优化更新。 字母缩写 TB 操作表(TableName) q_time 操作的时间字段(query_time) 代码都是经过...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 555
精华内容 222
关键字:

mysql计算同比和环比

mysql 订阅