gpt4 book ai didi

sql - 如果子表行包含值,则选择作为状态

转载 作者:行者123 更新时间:2023-12-04 22:04:34 26 4
gpt4 key购买 nike

我有 2 个名为 Order 和 OrderDetails 的表

订单表

    orderID   orderDate     OrderUserId
1 10 01.01.2010 .....
2 20 05.05.2011 .....

订单明细表

 DetailID   OrderIdOfDetail  DetailProductID   DetailStatusID
1 25 10 xxx 1
2 26 10 xxx 2
3 27 10 xxx 2
4 28 10 xxx 0
5 29 10 xxx 1
6 30 20 xxx 1
7 31 20 xxx 2
8 32 20 xxx 0

DetailStatusId for closed, pending, cancelled bla...

例如我想选择 orderID : 10。如果明细行包括 DetailsS​​tatusID 1,则选择订单状态为“待定”。如果明细行包括 DetailsS​​tatusID 2,则选择订单状态为“打开”。如果所有 DetailsS​​tatusID 都相等且为 0,则选择订单状态为“已关闭”

我试过“如果存在”但没有成功。我该怎么做?

最佳答案

您可以使用如下查询:

SELECT o.orderID, 
CASE
WHEN MAX(CASE WHEN DetailStatusID = 1 THEN 1 ELSE 0 END) +
MAX(CASE WHEN DetailStatusID = 2 THEN 1 ELSE 0 END) +
MAX(CASE WHEN DetailStatusID = 0 THEN 1 ELSE 0 END) >= 2
THEN 'MultiStatus'
WHEN COUNT(CASE WHEN DetailStatusID = 1 THEN 1 END) > 0 THEN 'Pending'
WHEN COUNT(CASE WHEN DetailStatusID = 2 THEN 1 END) > 0 THEN 'Open'
WHEN MAX(DetailStatusID) = 0 THEN 'Closed'
END AS Status
FROM Order AS o
JOIN OrderDetails AS od ON o.orderID = od.OrderIdOfDetail
GROUP BY orderID

查询使用 CASE 表达式来计算 Status 字段:

  • 它首先检查订单是否包含至少一个 DetailStatusID = 1 的记录。如果是,则返回“Pending”。
  • 然后检查订单是否包含至少一个 DetailStatusID = 2 的记录。如果确实如此,则返回“打开”。
  • 然后检查该组的所有记录是否都具有 DetailStatusID = 0。在这种情况下,返回“已关闭”。我假设 DetailStatusID 不能采用负值。

关于sql - 如果子表行包含值,则选择作为状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42904395/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com