【问题标题】:How do I calculate the percentage of dollar amount of approved orders out of total dollar amount of orders placed?如何计算已批准订单的美元金额占所下订单总美元金额的百分比?
【发布时间】:2020-09-04 10:17:05
【问题描述】:

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

Orders 表有三列:

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

Records 表也有三列,用于记录对订单所做的任何更改:

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

“记录”列存储字符串值,例如“订单已批准”、“订单被拒绝”、“发货城市更新”等。“log_made_at”列存储记录的时间戳。

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

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

seller     approved_order_dollar_amount_percentage
  abc                   0.6
  def                   0.0

我是如何得到上述计算的:卖家 abc 有两个订单(123 和 456),每个订单的价格标签分别为 50 和 75,因此他的总订单价格为 125。但是,只有订单 456 的最终日志为 '订单已获批准,因为订单 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

【问题讨论】:

  • 你试过什么?我们鼓励展示您的尝试。
  • 我不懂数学。你能告诉我们你是如何计算0.6的吗?
  • @TimBiegeleisen 对于卖家 abc,他有两个订单(123 和 456),每个订单的价格标签分别为 50 和 75,因此他的总订单价格为 125。但是,只有订单 456 有最终自 123 号订单最终被拒绝后的“订单已批准”日志。所以卖家abc最终批准的订单金额百分比是75/125 = 0.6。

标签: mysql sql sum average greatest-n-per-group


【解决方案1】:

您可以使用条件聚合:

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

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

【讨论】:

  • 我编辑了我的问题并添加了我正在运行的查询。你能指出我做错了什么吗?
  • @GandalfTheWat:你为什么不试试我建议的查询?
  • 当我运行您的查询时,我还收到“错误代码:1248 每个派生表都必须有自己的别名”
  • @GandalfTheWat:这是一个错字,已修复。所以你接受了答案,这意味着查询做了你想要的?
  • 不完全是因为实际查询要长得多,但它让我大致了解了如何修复当前查询
【解决方案2】:

首先,将卖家批准的订单汇总,然后将结果作为表格计算已批准订单占总订单的百分比。

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

【讨论】:

  • 您在 'select o.seller, sum(o.order_price) orders_approved' 行中在哪里定义 'order_approved'?
  • r.record = '订单已批准'
猜你喜欢
  • 2012-11-28
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多