如果订单完成的所有项目状态如何只计算订单完成
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
我在 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