有没有办法检查分组中的 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。

通常我会使用像 MAXMIN 这样的聚合函数。但是,唉,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
;