有没有办法检查分组中的 none 行是否包含值?
Is there a way to check that none of the rows in a grouping contain a value?
我有一个如下所示的查询:
SELECT ordDetails.OrderId
FROM orders.OrderDetail ordDetails
WHERE ordDetails.Class <> 'O'
GROUP BY ordDetails.OrderId
但这并不完全正确。 OrderId
在这个 table 中不是唯一的(因此 group by
子句)。我的 where
子句仅删除所有行的 Class
为 'O' 的 OrderId。 (即使有一行的值不是 'O',那么 OrderId
也会包含在结果中。)
我想要所有没有值为 'O' 的行的 OrderId。
通常我会使用像 MAX
或 MIN
这样的聚合函数。但是,唉,MAX
returns 'R' 和 MIN
returns '' (空字符串).
我真正需要的是一个聚合函数,它检查聚合中 none 的值是否与参数匹配。不幸的是没有这样的聚合函数。
有没有办法说(在 group by
查询中)“只给我没有与 'O' 匹配的行的结果”?
我想你正在寻找这样的东西:
select distinct
o.OrderId
from
OrderDetails as o
where not exists
(
select 1
from
OrderDetails as o2
where
o2.OrderId = o.OrderId and
o2.Class = '0'
)
您还可以使用:
SELECT ordDetails.OrderId
FROM OrderDetails ordDetails
GROUP BY ordDetails.OrderId
HAVING sum(case when ordDetails.Class='O' then 1 else 0 end)=0
还有更多选择。首先使用 except set operator
select distinct OrderId from @OrderDetails
except
select OrderId from @OrderDetails where Class = 'O'
;
并使用 HAVING 子句进行条件计数
select Orderid
from @OrderDetails
group by OrderId
having count(case Class when 'O' then 1 else null end) = 0
;
我有一个如下所示的查询:
SELECT ordDetails.OrderId
FROM orders.OrderDetail ordDetails
WHERE ordDetails.Class <> 'O'
GROUP BY ordDetails.OrderId
但这并不完全正确。 OrderId
在这个 table 中不是唯一的(因此 group by
子句)。我的 where
子句仅删除所有行的 Class
为 'O' 的 OrderId。 (即使有一行的值不是 'O',那么 OrderId
也会包含在结果中。)
我想要所有没有值为 'O' 的行的 OrderId。
通常我会使用像 MAX
或 MIN
这样的聚合函数。但是,唉,MAX
returns 'R' 和 MIN
returns '' (空字符串).
我真正需要的是一个聚合函数,它检查聚合中 none 的值是否与参数匹配。不幸的是没有这样的聚合函数。
有没有办法说(在 group by
查询中)“只给我没有与 'O' 匹配的行的结果”?
我想你正在寻找这样的东西:
select distinct
o.OrderId
from
OrderDetails as o
where not exists
(
select 1
from
OrderDetails as o2
where
o2.OrderId = o.OrderId and
o2.Class = '0'
)
您还可以使用:
SELECT ordDetails.OrderId
FROM OrderDetails ordDetails
GROUP BY ordDetails.OrderId
HAVING sum(case when ordDetails.Class='O' then 1 else 0 end)=0
还有更多选择。首先使用 except set operator
select distinct OrderId from @OrderDetails
except
select OrderId from @OrderDetails where Class = 'O'
;
并使用 HAVING 子句进行条件计数
select Orderid
from @OrderDetails
group by OrderId
having count(case Class when 'O' then 1 else null end) = 0
;