xiao362213712 2023-04-15 10:02 采纳率: 100%
浏览 53
已结题

sql金额替换并分摊


sql金额减小并分摊到明细
本月订单金额为37847,现在需要把金额减小再平摊到每个订单明细
如:本月有1879张订单 总金额为37847,每张订单下面有不同数量及价格的商品。现在需要将整月的订单金额降低到29867,并分摊到每个品种上,最终分摊下来总金额为29867,不论按总订单量或按明细查 金额误差都不能超过1
需要代码

  • 写回答

2条回答 默认 最新

  • 社区专家-Monster-XH 2023-04-15 10:13
    关注

    基于Monster 组和GPT的调写:

    -- 先计算本月订单总金额
    SELECT SUM(amount) AS total_amount
    FROM orders
    WHERE month = '2023-04';
    
    -- 假设上面的查询结果为 37847,那么我们可以按以下方式将金额减小并分摊到明细上
    WITH cte AS (
      -- 将订单按金额从小到大排序,并为每个订单分配一个序号
      SELECT *,
             ROW_NUMBER() OVER (ORDER BY amount) AS row_num
      FROM orders
      WHERE month = '2023-04'
    ),
    cte2 AS (
      -- 计算每个订单需要分配的金额
      SELECT *,
             amount - (37847 - 29867) / COUNT(*) OVER () AS adjusted_amount
      FROM cte
    ),
    cte3 AS (
      -- 将每个订单的金额分摊到该订单的明细上
      SELECT *,
             adjusted_amount / COUNT(*) OVER (PARTITION BY order_id) AS final_amount
      FROM cte2
    )
    -- 更新订单明细表中的金额
    UPDATE order_details
    SET amount = cte3.final_amount
    FROM cte3
    WHERE order_details.order_id = cte3.order_id
      AND order_details.product_id = cte3.product_id;
    
    
    

    用了三个公用表表达式(CTE)来完成任务:

    • 第一个 CTE 用于给每个订单分配一个序号,以便后续处理。
    • 第二个 CTE 用于计算每个订单需要分配的金额。我们将总金额减去目标金额(29867),然后将其平均分配给每个订单。
    • 第三个 CTE 用于将每个订单的金额分摊到其明细上。我们使用窗口函数计算每个订单有多少个明细,并将订单的金额平均分配给每个明细。

    最后用 UPDATE 语句将最终的金额更新到订单明细表中。 WHERE 子句中,将订单 ID 和产品 ID 与 CTE 中的值进行匹配,以确保更新正确的行。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月15日
  • 已采纳回答 4月15日
  • 修改了问题 4月15日
  • 修改了问题 4月15日
  • 展开全部

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。