我有一個看起來像這樣的查詢:
SELECT ordDetails.OrderId
FROM orders.OrderDetail ordDetails
WHERE ordDetails.Class <> 'O'
GROUP BY ordDetails.OrderId
但這并不完全正確。 OrderId在此表中不是唯一的(因此有group by子句)。我的where子句僅洗掉所有行都帶有Class“O”的 OrderId。(如果甚至有一行的值不是“O”,則該OrderId值包含在結果中。)
我想要所有沒有值為“O”的行的 OrderId。
通常我只會使用一個聚合函式,比如MAXor MIN。但是,唉,MAX回傳 'R' 并MIN回傳 ''(空字串)。
我真正需要的是一個聚合函式,它檢查聚合中的值是否與引數匹配。不幸的是,沒有這樣的聚合函式。
有沒有辦法說(在group by查詢中)“只給我沒有匹配'O'的行的結果”?
uj5u.com熱心網友回復:
我想你正在尋找這樣的東西:
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'
)
uj5u.com熱心網友回復:
您還可以使用:
SELECT ordDetails.OrderId
FROM OrderDetails ordDetails
GROUP BY ordDetails.OrderId
HAVING sum(case when ordDetails.Class='O' then 1 else 0 end)=0
uj5u.com熱心網友回復:
還有更多選擇。首先使用 except 集合運算子
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
;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/467826.html
標籤:sql sql服务器 tsql 通过...分组 sql-server-2012
上一篇:如何獲取按ID分組的資料
