如何用SQL按月份计算页面访问量的同比增减百分比?
实现同比访问量增减百分比的SQL查询
以下是完善后的SQL查询语句,支持输入指定年份,计算该年份各月访问量相较于上一年同期的增减百分比:
-- 可替换为目标年份,或使用变量参数化 DECLARE @CurrentYear INT = 2023; WITH MonthlyVisits AS ( SELECT YEAR([DateTime]) AS VisitYear, MONTH([DateTime]) AS MonthNum, FORMAT([DateTime], 'MMMM') AS MonthName, COUNT(*) AS VisitorCount FROM [BasicCore.VisitorCounter] GROUP BY YEAR([DateTime]), MONTH([DateTime]), FORMAT([DateTime], 'MMMM') ) SELECT mv_current.MonthName AS [Month], mv_current.VisitorCount AS [CounterOfVisitors], CASE -- 处理上年同期无访问量的情况,避免除以0错误 WHEN mv_prev.VisitorCount IS NULL THEN '无上年数据' WHEN mv_prev.VisitorCount = 0 THEN 'N/A' ELSE CONCAT(ROUND(((mv_current.VisitorCount - mv_prev.VisitorCount) * 100.0 / mv_prev.VisitorCount), 2), '%') END AS [Percentage] FROM MonthlyVisits mv_current LEFT JOIN MonthlyVisits mv_prev ON mv_current.MonthNum = mv_prev.MonthNum AND mv_current.VisitYear = mv_prev.VisitYear + 1 WHERE mv_current.VisitYear = @CurrentYear ORDER BY mv_current.MonthNum;
关键逻辑说明:
- CTE
MonthlyVisits:先统计所有年份的月度访问量,包含年份、月份数字(用于排序和关联)、月份名称、访问量,为后续同比计算做基础。 - 自关联匹配上年数据:通过
LEFT JOIN关联当前年份和上一年的同月份数据,确保即使上年无数据,当前年的记录仍能正常显示。 - 百分比计算:
- 若上年无对应月份数据,显示
无上年数据; - 若上年访问量为0,显示
N/A避免除以0错误; - 正常情况计算增减幅度,保留两位小数并添加百分号。
- 若上年无对应月份数据,显示
- 排序:按
MonthNum排序,保证月份按自然顺序展示(避免文本格式的月份名称排序混乱)。
内容的提问来源于stack exchange,提问作者Matías Alejandro Novillo
相关产品推荐
相关产品推荐

