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

标签 sql sql-server sql-server-2008-r2

我有 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/

相关文章:

sql - ORA-00979 : not a GROUP BY expression

C# 列表从数据库中检索元组只返回第一个可用的元组

sql - 患者和疾病的数据库设计

sql-server - select top 10 ... 和 select top 30 遵循不同的执行计划

sql - T-SQL,如何执行此分组查询?

mysql - 如何在 mysql 中为大量用户创建消息系统而无需花费太多时间?

sql - 当列是字符串数据类型时,在 mssql 中使用 'Pivot' 将行转换为列

sql-server - 安装 SQL Server 2008 Developer 时要使用哪些帐户

sql-server - 对一列进行排名,同时对另一列进行排序

java - 如何使用一个 SQL 查询从一个独立排序的表中合并两个结果集?