Mysql 获取列总和,并将其用于分配值

Mysql 获取列总和,并将其用于分配值,mysql,join,count,sum,window-functions,Mysql,Join,Count,Sum,Window Functions,我有两张桌子,销售订单和销售订单行 销售订单表包含交易级别的交易明细,销售订单行表包含SKU(项目)级别的明细。我加入了这两个表,意识到折扣价值在交易层面。当客户购买超过1件物品时,我需要根据物品价格分配折扣的值,当客户仅购买1件物品时,按原样应用折扣值。这些桌子看起来像这样 销售订单 ID | PLATFORM_ORDER_CODE | OMS_ORDER_CODE | DISCOUNT_TOTAL 0001 19000001 nebula0001

我有两张桌子,销售订单和销售订单行

销售订单表包含交易级别的交易明细,销售订单行表包含SKU(项目)级别的明细。我加入了这两个表,意识到折扣价值在交易层面。当客户购买超过1件物品时,我需要根据物品价格分配折扣的值,当客户仅购买1件物品时,按原样应用折扣值。这些桌子看起来像这样

销售订单

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_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
这是我的尝试,我需要这样的结果

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 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

计算订单行折扣的逻辑是计算当前订单行单价与当前平台订单代码总价的比率,然后将其应用于订单折扣。

如果运行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

计算订单行折扣的逻辑是计算当前订单行单价与当前平台订单代码总价的比率,然后将其应用于订单折扣。

@HilmanDhannysworo如果您的服务器版本为8+,我建议使用GMB提供的解决方案。@HilmanDhannysworo如果您的服务器版本为8+,我建议使用GMB提供的解决方案。