Sql 如果子表行包含值,则选择“作为状态”
我有两个名为Order和OrderDetails的表 订单表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
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
- 然后检查组的所有记录是否都具有
。在这种情况下,返回“Closed”。我假设DetailStatusID不能接受否定值DetailStatusID=0
左连接
到一个派生表(子查询),该派生表使用条件聚合来计算不同的详细状态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很乐意帮忙!