【问题标题】:Get column sum and use it for distribute a value获取列总和并将其用于分配值
【发布时间】:2020-06-03 10:24:28
【问题描述】:

我有 2 个表,sales_order 和 sales_order_line。

sales_order 表包含交易级别的交易详情,sales_order_line 表包含 SKU(项目)级别的详情。我加入了这两张表,并意识到 discount 的价值在于交易级别。当客户购买超过 1 件商品时,我需要根据商品价格分配 折扣 的价值,而当客户仅购买 1 件商品时,折扣 价值就按原样应用。表格如下所示。

sales_order

ID   | PLATFORM_ORDER_CODE | OMS_ORDER_CODE | DISCOUNT_TOTAL
0001          19000001         nebula0001         300000
0002          19000001         nebula0002         300000
0003          19000001         nebula0003         300000
0004          19000002         nebula0004         100000
0005          19000002         nebula0005         100000
0006          19000003         nebula0006          50000

sales_order_line

SALES_ORDER_ID | PLATFORM_ORDER_CODE | SKU_CODE | UNIT_PRICE
0001                   19000001        SKUA0001     200000
0002                   19000001        SKUA0002     100000
0003                   19000001        SKUA0003     300000
0004                   19000002        SKUA0001     200000
0005                   19000002        SKUA0002     100000
0006                   19000003        SKUA0001     200000

这是我对DB Fiddle 的尝试,我需要这样的结果

PLATFORM_ORDER_CODE | OMS_ORDER_CODE | SKU_CODE | UNIT_PRICE | DISCOUNT
19000001                 nebula0001    SKUA0001     200000      100000
19000001                 nebula0002    SKUA0002     100000      50000
19000001                 nebula0003    SKUA0003     300000      150000
19000002                 nebula0004    SKUA0001     200000      66666.6666
19000002                 nebula0005    SKUA0002     100000      33333.3333
19000003                 nebula0006    SKUA0001     200000      50000

【问题讨论】:

    标签: mysql join count sum window-functions


    【解决方案1】:
    SELECT B.PLATFORM_ORDER_CODE, 
           A.OMS_ORDER_CODE, 
           B.SKU_CODE, 
           B.UNIT_PRICE, 
           A.DISCOUNT_TOTAL/C.TOTAL_PRICE*B.UNIT_PRICE DISCOUNT
    FROM t_td_sales_order A
    JOIN t_td_sales_order_line B ON B.SALES_ORDER_ID = A.ID
    JOIN ( SELECT PLATFORM_ORDER_CODE, SUM(UNIT_PRICE) TOTAL_PRICE
           FROM t_td_sales_order_line
           GROUP BY PLATFORM_ORDER_CODE ) C ON B.PLATFORM_ORDER_CODE = C.PLATFORM_ORDER_CODE
    

    fiddle

    【讨论】:

    • @HilmanDhannysworo 如果您的服务器版本是 8+,我建议使用 GMB 提供的解决方案。
    【解决方案2】:

    如果您运行的是 MySQL 8.0,您可以为此使用窗口函数:

    select 
        o.platform_order_code,
        o.oms_order_code,
        l.sku_code,
        l.unit_price,
        o.discount_total 
            * l.unit_price 
            / sum(l.unit_price) over(partition by o.platform_order_code) discount
    from sales_order o
    inner join sales_order_line l on l.sales_order_id  = o.id
    

    计算订单行折扣的逻辑是计算当前订单行unit_price与当前platform_order_code的总价格的比率,然后将其应用于订单折扣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 2021-08-04
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      • 2020-07-04
      相关资源
      最近更新 更多