如何编写SQL查询来通过排除克隆交付取消来获取已完成和取消交付的数量?

发布于 2025-01-30 17:31:35 字数 1168 浏览 2 评论 0原文

id送达parentid状态
1parentdelivery10取消
21取消
31b1完成
clonedelivery1c1取消
5parentDelivery20取消
4Clonedelivery2A6typertype
1a克隆5
克隆

这个 示例):

已完成交付的已完成交货数量的
数量22

所有父送货都有0,作为父级和克隆送货 在这里,如果完成了父母和克隆的1次交付,则应将其算作完成,并且应取消所有克隆的取消。
*父送货员可以有0个克隆
*克隆交付不会有自己的克隆
*如果取消父母的送达,但其克隆的任何1个都已完成,则应将其视为1件完成,并取消0(其他取消的取消,不应在取消的交货中计数

)应计算为1个取消。如何为此编写SQL查询?

我正在使用MySQL Workbench社区版本8.0.29

IddeliverytypeparentIdstatus
1parentDelivery10cancelled
2cloneDelivery1a1cancelled
3cloneDelivery1b1completed
4cloneDelivery1c1cancelled
5parentDelivery20cancelled
6cloneDelivery2a5cancelled
7cloneDelivery2b5cancelled
8cloneDelivery 2c5cancelled
9parentDelivery30completed
10parentDelivery40cancelled

expected output(for this example):

number of completed deliveriesnumber of cancelled deliveries
22

All parent deliveries have 0 as parent id and clone deliveries have its parentId in parentId column
Here if even 1 delivery out of parent and clones is completed then it should count as completed and all clone cancellation should be eliminated.
*Parent deliveries can have 0 clones
*Clone deliveries will not have clone of its own
*If Parent delivery is cancelled but any 1 of its clone is completed then it should be considered as 1 completed and 0 cancelled(the other cancellations should not be counted under cancelled deliveries)

If all the delivery out of parent and clones is cancelled then it should be counted as 1 cancellation. How can I write an SQL query for this?

I am using MySQL workbench community version 8.0.29

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

鼻尖触碰 2025-02-06 17:31:35

我的释义逻辑...

  • 如果父母说完成了,
  • 如果父母说取消了,但任何孩子都说完成了,它完成了,
  • 否则,父母和所有孩子都说取消了,所以它被取消了,

这给了...

WITH
  parent_outcome AS
(
  SELECT
    p.id,
    CASE
      WHEN MAX(p.status) = 'completed' THEN 1
      WHEN MAX(c.status) = 'completed' THEN 1
      ELSE 0
    END
      AS is_completed
  FROM
    your_table AS p
  LEFT JOIN
    your_table AS c
       ON c.parent_id = p.id
  WHERE
    p.parent_id = 0
  GROUP BY
    p.id
)
SELECT
             SUM(is_completed) AS is_completed,
  COUNT(*) - SUM(is_completed) AS is_cancelled
FROM
  parent_outcome

My paraphrased logic...

  • if the parent says completed, it is completed
  • if parent says cancelled, but any children say completed, it is completed
  • else, parent and all children say cancelled, so it is cancelled

Which gives...

WITH
  parent_outcome AS
(
  SELECT
    p.id,
    CASE
      WHEN MAX(p.status) = 'completed' THEN 1
      WHEN MAX(c.status) = 'completed' THEN 1
      ELSE 0
    END
      AS is_completed
  FROM
    your_table AS p
  LEFT JOIN
    your_table AS c
       ON c.parent_id = p.id
  WHERE
    p.parent_id = 0
  GROUP BY
    p.id
)
SELECT
             SUM(is_completed) AS is_completed,
  COUNT(*) - SUM(is_completed) AS is_cancelled
FROM
  parent_outcome
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文