Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果子表行包含值,则选择“作为状态”_Sql_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

Sql 如果子表行包含值,则选择“作为状态”

Sql 如果子表行包含值,则选择“作为状态”,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我有两个名为Order和OrderDetails的表 订单表 orderID orderDate OrderUserId 1 10 01.01.2010 ..... 2 20 05.05.2011 ..... OrderDetails表 DetailID OrderIdOfDetail DetailProductID DetailStatusID 1 25 10

我有两个名为Order和OrderDetails的表

订单表

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

 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
已关闭、挂起、取消bla的DetailStatusId

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

我尝试过“如果存在”,但没有成功。
如何执行此操作?

您可以使用如下查询:

select *, case when DetailStatusID = '1' then 'Pending'
               when DetailStatusID = '2' then 'Open'
               when DetailStatusID = '0' then 'Closed'
          end as OrderStatusDescription
From OrderDetails
Where OrderIdOfDetail = '10'
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 
查询使用一个
大小写
表达式来计算
状态
字段:

  • 它首先检查订单是否包含至少一条
    DetailStatusID=1
    的记录。如果不存在,则返回“挂起”
  • 然后检查订单是否至少包含一条
    DetailStatusID=2
    的记录。如果返回“打开”
  • 然后检查组的所有记录是否都具有
    DetailStatusID=0
    。在这种情况下,返回“Closed”。我假设DetailStatusID不能接受否定值

这将使用一个
左连接
到一个派生表(子查询),该派生表使用条件聚合来计算不同的
详细状态ID
。如果由于某种原因,
OrderId
没有相应的详细信息记录,这也将返回
Status
Other
结果

select o.*
  , [Status]=case 
      when od.Status0 > 0 and od.Status0 = od.DetailCount 
        then 'Closed'
      when od.Status1 > 0
        then 'Pending'
      when od.Status2 > 0
        then 'Open'
      else 'Other'
      end
from orders as o
  left join (
    select 
        OrderIdOfDetail
      , DetailCount = count(*)
      , Status0 = sum(case when DetailStatusId = 0 then 1 else 0 end)
      , Status1 = sum(case when DetailStatusId = 1 then 1 else 0 end)
      , Status2 = sum(case when DetailStatusId = 2 then 1 else 0 end)
    from OrderDetails 
    group by OrderIdOfDetail
  ) as od 
    on o.OrderId = od.OrderIdOfDetail
rextester演示:

查询结果:

+---------+---------------------+-------------+---------+
| orderID |      orderDate      | OrderUserId | Status  |
+---------+---------------------+-------------+---------+
|      10 | 01.01.2010 00:00:00 |           1 | Pending |
|      20 | 05.05.2011 00:00:00 |           2 | Pending |
+---------+---------------------+-------------+---------+
+-----------------+-------------+---------+---------+---------+
| OrderIdOfDetail | DetailCount | Status0 | Status1 | Status2 |
+-----------------+-------------+---------+---------+---------+
|              10 |           5 |       1 |       2 |       2 |
|              20 |           3 |       1 |       1 |       1 |
+-----------------+-------------+---------+---------+---------+
仅子查询结果:

+---------+---------------------+-------------+---------+
| orderID |      orderDate      | OrderUserId | Status  |
+---------+---------------------+-------------+---------+
|      10 | 01.01.2010 00:00:00 |           1 | Pending |
|      20 | 05.05.2011 00:00:00 |           2 | Pending |
+---------+---------------------+-------------+---------+
+-----------------+-------------+---------+---------+---------+
| OrderIdOfDetail | DetailCount | Status0 | Status1 | Status2 |
+-----------------+-------------+---------+---------+---------+
|              10 |           5 |       1 |       2 |       2 |
|              20 |           3 |       1 |       1 |       1 |
+-----------------+-------------+---------+---------+---------+

那么,订单id为10的样本数据集的预期结果是什么?你能给出更具体的例子吗?谢谢。但我想知道如果order同时包含两个DetailsStatusID=1 DetailsStatusID=2@serdarOP中给出的要求不包括这种情况。在这种情况下,您希望发生什么?例如,详细信息行包含DetailStatusID=1,也包含DetailStatusID=2,甚至包含DetailStatusID= 0 . 在这种情况下,哪个状态名将返回?@serdar我不知道。您必须告诉我,因为您知道用例的实际需求。在这种情况下,您希望得到什么结果?例如,如果细节行包含DetailStatusID=1,DetailStatusID=2,甚至DetailStatusID=0,返回为“MultiStatus”,我可以这样做吗?添加一个解释来解释为什么这样可以解决问题,这将大大改进您的答案。Hello@SqlZim DetailCount始终返回1。@serdar我添加了一个rextester演示并包括查询和子查询的结果。如果
DetailCount
始终返回1,则该
orderID
只有1个详细信息行,或者您可能意外更改了分组依据。。谢谢。是的,向分组依据添加了其他列名。因为我遇到了此错误:“od.detailID”列在选择列表中无效,因为它不包含在聚合函数或group by子句中。:/@SqlZim@serdar那不行,试着再看一次演示。您不应该按
od.detailID
进行分组@serdar很乐意帮忙!