如何用SQL查询计算2020年月度原始访问量相对2019年的变化率?
解决同一列中跨年月访问量变化率计算的SQL方案
没问题,我来帮你搞定这个需求!当两年的访问数据都在同一列时,我们可以通过自连接或者条件聚合的方式把同期数据对齐,再计算变化率。下面我分两种常用方法来演示,你可以根据自己的表结构调整。
先假设你的数据结构
首先咱们先明确下基础的表结构(你可以替换成自己实际的表名、字段名):
假设表名为visit_stats,包含三个核心字段:
year:年份(比如2019、2020)month:月份(1-12)raw_visits:当月原始访问量
方法一:自连接(直观易懂)
通过将表自身连接,把2019和2020年的同期数据关联到同一行,再直接套用公式计算:
SELECT t20.month, -- 计算变化率,ROUND保留2位小数,可按需调整 ROUND((t20.raw_visits / t19.raw_visits) * 100, 2) AS visit_change_rate FROM visit_stats t20 INNER JOIN visit_stats t19 ON t20.month = t19.month WHERE t20.year = 2020 AND t19.year = 2019 -- 限定1-4月 AND t20.month BETWEEN 1 AND 4 ORDER BY t20.month;
说明:
- 给表起别名
t20(代表2020年数据)和t19(代表2019年数据),通过month字段关联,确保同一月份的两年数据对齐。 INNER JOIN会自动过滤掉某一年缺失的月份(如果有的话),如果想保留所有1-4月(哪怕某一年没数据),可以换成LEFT JOIN,此时缺失数据的月份变化率会显示为NULL。
方法二:条件聚合(无需连接)
用CASE WHEN配合聚合函数,把两年的同期数据提取到同一行,再计算变化率:
SELECT month, ROUND( (MAX(CASE WHEN year = 2020 THEN raw_visits END) / MAX(CASE WHEN year = 2019 THEN raw_visits END)) * 100, 2 ) AS visit_change_rate FROM visit_stats WHERE year IN (2019, 2020) AND month BETWEEN 1 AND 4 GROUP BY month ORDER BY month;
说明:
CASE WHEN会分别筛选出2020和2019年的访问量,MAX函数(因为每个月每年只有一条数据,用MIN/SUM也可以)将它们聚合到同一行。- 这种方法不需要表连接,代码更紧凑,适合数据量较大的场景。
额外优化:避免除以0报错
如果2019年某个月份的访问量为0,直接计算会触发除以0的错误,你可以用NULLIF函数处理:
-- 以自连接为例,条件聚合同理 ROUND((t20.raw_visits / NULLIF(t19.raw_visits, 0)) * 100, 2) AS visit_change_rate
这样当2019年数据为0时,变化率会显示为NULL,而不是报错。
以上两种方法最终都会返回4行数据,对应2020年1-4月各自相对2019年同期的访问量变化率。
内容的提问来源于stack exchange,提问作者sjs521
相关产品推荐
相关产品推荐

