我有 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。 如果明细行包括 DetailsStatusID 1,则选择订单状态为“待定”。 如果明细行包括 DetailsStatusID 2,则选择订单状态为“打开”。 如果所有 DetailsStatusID 都相等且为 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/