Mysql 查询获取每周比较的差异%

问题描述 投票:0回答:1

我需要一个脚本来获取每周比较数据的百分比差异。我已经有了一个可以在除实际周之外的所有周内正常运行的脚本。 我遇到的问题是,对于本周,我只想比较已完成的日期,例如,如果今天是星期三,我想将本周的星期一+星期二与上周的星期一+星期二进行比较。我的脚本正在将本周的周一+周二与上周整周进行比较。

这是我需要的输出:

周数 年份 %订单差异 %NC 差异
20 2024 30.47% 30.56%
19 2024 29.96% 32.20%
18 2024 32.08% 31.29%

这是我的实际脚本:

WITH CTE AS ( 
  SELECT  
        week(purchased_est,1) as weeknum, 
        year(purchased_est) as yearsales,  
        count(*) as TotalOrders , 
    IFNULL(SUM(net_comp),0) as NCTotal
   FROM revenue
   WHERE purchased_est < @today 
   GROUP by week(purchased_est,1), YEAR(purchased_est)
   order by YEAR(purchased_est) desc,  week(purchased_est,1) desc
)
SELECT
  CTE.weeknum, 
  CTE.yearsales, 
  CONCAT(ROUND((CTE.TotalOrders -  LEAD(CTE.TotalOrders) OVER (ORDER BY CTE.yearsales desc, CTE.weeknum desc))/ LEAD(CTE.TotalOrders) OVER (ORDER BY CTE.yearsales desc, CTE.weeknum desc) *100,2),'%') as 'Orders difference',
  CONCAT(ROUND((CTE.NCTotal -  LEAD(CTE.NCTotal) OVER (ORDER BY CTE.yearsales desc, CTE.weeknum desc))/ LEAD(CTE.NCTotal) OVER (ORDER BY CTE.yearsales desc, CTE.weeknum desc) *100,2),'%') as 'NC difference'
FROM CTE

此脚本无法正确计算本周的数学,它正在比较本周完成的天数(今天之前的天数)与上周的整个情况。

请帮助我!

mysql common-table-expression recursive-query
1个回答
0
投票

使用

LAG
查看上一行。这可以在没有任何
WITH
或子查询的情况下完成,但为了更容易理解,这里分为三个步骤:聚合、LAG 查看前一周、最终计算。

WITH
  aggregated AS
  (
    SELECT  
      YEAR(purchased_est) AS year_sales,
      WEEK(purchased_est, 1) AS week_number, 
      COUNT(*) AS total_orders,
      COALESCE(SUM(net_comp), 0) AS total_nc
    FROM revenue
    WHERE purchased_est < @today
    GROUP by YEAR(purchased_est), WEEK(purchased_est, 1)
  ),
  with_previous AS
  (
    SELECT  
      year_sales,
      week_number, 
      total_orders,
      total_nc,
      LAG(total_orders) OVER (ORDER BY year_sales, week_number) AS prev_orders,
      LAG(total_nc) OVER (ORDER BY year_sales, week_number) AS prev_nc
    FROM aggregated
  )
SELECT 
  year_sales,
  week_number, 
  orders_total,
  nc_total,
  CASE WHEN prev_orders > 0 THEN (1 - (total_orders / prev_orders)) * 100 END AS orders_diff_percent,
  CASE WHEN prev_nc > 0 THEN (1 - (total_nc / prev_nc)) * 100 END AS nc_diff_percent
FROM with_previous
ORDER BY year_sales, week_number;
© www.soinside.com 2019 - 2024. All rights reserved.