环比练习

不得不说一个三年数据库分析师给出的环比练习题,真的让小白瑟瑟发抖,还请教了一个经理,完全被打败。对数据库的运用真的是一门高深的学问,然鹅燃起对DBA的崇敬之情。搜索很多的技术文章都没有纯用sql做环比的文章,在此附上卡了一周本人的错误思路和最终大神的成品代码。

需求:按月份统计数据综合并做环比

原始数据
在这里插入图片描述
要求按月份环比后结果:(此处不知如何将字符型转变成为 '%Y%m’的形式,尝试多次望网友留言修改)
在这里插入图片描述

本人的思路:将每个月按月加和后再根据月份用DATE_SUB函数得到新表,以月份为条件,用环比公式
环比增长率=(本期的某个指标的值-上一期这个指标的值)/上一期这个指标的值*100%
计算出来ring_ratio。但是本人的代码中将数据不同的部分做了 ‘=’ 比较,导致报错,并在表的按月求时无法正确嵌入,思维混乱。
以下是实践中的代码
(1)
SELECT
DATE_FORMAT(date, ‘%Y-%m’) AS year_mon,
sum(cnt) AS cnt
FROM
ringratio_month
GROUP BY
year_mon
仅仅完成了常规按月求和输出
在这里插入图片描述
(2)第二部的思路为建立新表,令新名称与旧表进行环比率的运算,但是LEFT(RIGHT) JOIN运用错误,未嵌入步骤(1),无法按月求和,结尾的 “ON a.date = b.bfmon” 并未将新旧表进行比较,即未成功实现有链接运算。
SELECT
b.year_mon,
a.cnt bfnum,
DATE_FORMAT(b.bfmon,’%Y-%m-%d’) AS bfmon
FROM
(
SELECT
DATE_FORMAT(date, ‘%Y%m%d’) AS date,
cnt
FROM
ringratio_month
)a
RIGHT JOIN (
SELECT
date year_mon,
DATE_FORMAT(
DATE_SUB(date, INTERVAL 1 MONTH),
‘%Y%m%d’
) bfmon
FROM
ringratio_month
) b ON a.date = b.bfmon;
在这里插入图片描述

屈服环比。。。。。。大神代码思路虽同但更简单易读,清晰简便,函数运用灵活。
附大神代码及结果:
SELECT
– DATE_FORMAT(c.year_mon,’%Y-%m’)
– STR_TO_DATE(c.year_mon,’%Y-%m’)
c.year_mon,
c.cnt,
c.ring_ratio
FROM
(
SELECT
LEFT (a.year_mon, 6) AS year_mon,
a.cnt,
LEFT (b.year_mon, 6) AS year_mon_ago,
b.cnt AS cnt_ago,
CASE
WHEN b.cnt = 0
OR b.cnt IS NULL THEN
NULL – 设为0亦可
ELSE
cast(
(a.cnt - b.cnt) / b.cnt AS DECIMAL (10, 2)
)
END AS ring_ratio
FROM
(
SELECT
concat(
DATE_FORMAT(date, ‘%Y%m’),
‘01’
) AS year_mon,
sum(cnt) AS cnt
FROM
ringratio_month
GROUP BY
DATE_FORMAT(date, ‘%Y%m’)
) a
LEFT JOIN (
SELECT
concat(
DATE_FORMAT(date, ‘%Y%m’),
‘01’
) AS year_mon,
sum(cnt) AS cnt
FROM
ringratio_month
GROUP BY
DATE_FORMAT(date, ‘%Y%m’) – a,b表结构一样才能LEFT JOIN ON,所有select内完全一致
) b ON STR_TO_DATE(a.year_mon, ‘%Y%m%d’) = date_add(
STR_TO_DATE(b.year_mon, ‘%Y%m%d’),
INTERVAL 1 MONTH
)
) c
在这里插入图片描述

请教网上大神对year_mon的格式进行修改,小白不知如何再以最简单的方式使 ‘201807’ ——> ‘2018-07’

猜你喜欢

转载自blog.csdn.net/LVEVIL/article/details/82771976