如何计算已批准订单的金额占已下订单总金额的百分比?

How do I calculate the percentage of dollar amount of approved orders out of total dollar amount of orders placed?

我有两个table,订单和记录如下。

订单 table 有三列:

order_id     seller     order_price
  123         abc           50 
  456         abc           75
  789         def           60

记录 table 也有三列,其中记录了对订单所做的任何更改:

order_id       log_made_at          record
  123       2018-08-05 11:00:00     order approved
  123       2018-08-05 12:00:00     shipping city updated
  123       2018-08-05 12:00:10     order declined
  456       2018-08-05 12:10:00     order approved
  789       2018-08-05 12:20:10     order declined

'record'列存储'order approved'、'order declined'、'shipping city updated'等字符串值。'log_made_at'列存储时间戳记录了。

如果我想计算已批准订单的美元金额占每个卖家的总订单金额($ 已批准订单金额)/($ 总订单金额)的百分比,我应该使用什么查询?我很难隔离最后一次记录的订单 'order approved' 以将其价格用作已批准订单的 $ 金额。

我希望使用上面的示例数据得到的结果如下所示:

seller     approved_order_dollar_amount_percentage
  abc                   0.6
  def                   0.0

我是如何得出以上计算结果的:卖家abc有两个订单(123和456),每个订单的价格分别为50和75,所以他的总订单价格为125。但是,只有456的订单有最终日志'order approved' 自第 123 号订单最终被拒绝后做出的。所以卖家 abc 最终批准的订单美元金额百分比是 75/125 = 0.6.

我试过的查询 运行 是这个,但它总是给我错误的数字:

SELECT order_price
        FROM orders o
        INNER JOIN records r ON o.order_id = r.order_id
        WHERE r.log_made_at IN (
            SELECT MAX(log_made_at) 
            FROM records
            GROUP BY order_id)
        AND r.record = 'order approved'
    )/SUM(total_order_price) AS approval_rate_by_sum

您可以使用条件聚合:

select 
    seller, 
    sum(case when r.record = 'order approved' then o.order_price else 0 end) 
        / sum(o.order_price) as approved_order_dollar_amount_percentage
from orders o
left join (
    select r.*, row_number() over(partition by orderid order by log_made_at desc) rn
    from records r
) r on r.order_id = o.order_id and r.rn = 1
group by seller

子查询检索每个订单的最后一条记录,然后外部查询聚合并进行计算。

首先,对卖家批准的订单求和,然后将结果用作 table 计算批准订单占总订单的百分比。

select t.seller, 
      (t.orders_approved / (select sum(o.order_price) 
                            from orders o 
                            where o.seller=t.seller)
      ) approved_order_dollar_amount_percentage
from
  (select o.seller, sum(o.order_price) orders_approved
   from records r inner join orders on (o.order_id=r.order_id)
   where
    r.record = 'order approved'
    and
    r.log_mad_at = (
       select max(r2.log_mad_at)
       from records r2
       where 
        r2.order_id=r.order_id
      )
   group by o.seller
  ) t