如果订单完成的所有项目状态如何只计算订单完成

How to only count the Order finish if all items status from order finish

我在 mysql

有一个表格订单

每个订单的商品详情:

我想在订单 table 和商品 table 中按状态统计订单摘要,预期结果:

我试过这个查询:

SELECT 
count(case when o.status = 'received' THEN 1 ELSE 0 END) AS received,
count(case when i.status = 'finish' THEN 1 ELSE 0 END) AS finish,
count(case when o.status = 'cancel' THEN 1 ELSE 0 END) AS cancel
    FROM 
     orders o INNER JOIN items i on o.id=i.order_id
    GROUP BY o.id, i.status
    HAVING i.status = 'finish'

看起来在完成栏中仍然按照它自己的顺序计算所有项目。如果状态为 finish

的订单中的所有项目,我想将 finish 列计为 1

确认一下,一个订单可以由多个sub-parts组成。任何 sub-part 的完成状态可能(或不)完成。您希望获得所有 sub-parts 都已完成的订单。对吗?

如果是这样,您可以通过计算订单详细信息来进行查询,这样标记为 'finish' 的所有条目都等于同一订单的条目数。一旦结果合格,您可以从主订单中获取详细信息,例如客户是谁等。

select
      PreQueryResult.orderID,
      PreQueryResult.TotalSubParts,
      PreQueryResult.FinishedSubParts,
      o.date,
      o.status
   from
      ( select
              od.orderid,
              count(*) as TotalSubParts,
              sum( case when od.status = 'finish'
                        then 1 else 0 end ) as FinishedSubParts
           from
              order_detail od
           group by
              od.orderid ) PreQueryResult
        JOIN Orders o
           on PreQueryResult.orderid = o.orderid

所以如果你运行上面的查询,你会看到总部分和总计完成的结果。要将最终结果集限制为完整的结果集,只需添加一个最终的 WHERE 子句,例如

   where
      PreQueryResult.TotalSubParts = PreQueryResult.FinishedSubParts

但是您考虑到订单已取消的状态,您可以将上面的内容包裹到另一层中以获取您的计数,例如按天分组

我想按订单 table 和商品 table 中的状态统计订单摘要,预期结果:在此处输入图片描述

select
      Final.date,
      sum(case when Final.status = 'received' THEN 1 ELSE 0 END) received,
      sum(case Final.TotalSubParts = PreQueryResult.FinishedSubParts
                THEN 1 ELSE 0 END) finish,
      sum(case when o.status = 'cancel' THEN 1 ELSE 0 END) cancel
   from
      (entire query from above without where clause) Final
   group by
      Final.date