我只想从订单表中检索已支付所有订单的客户。 (付费='Y')。
订单表如下所示:
Cus # Order # Paid
111 1 Y
111 2 Y
222 3 Y
222 4 N
333 5 N
在此示例中,查询应仅返回客户111。
查询
Select * from order where Paid = 'Y';
除了已支付所有订单(客户111)的客户外,还会退还已付款和未付订单的客户(例如客户222)。
如何构建查询以评估客户的所有订单,并仅返回已支付所有订单的客户的信息?
答案 0 :(得分:2)
以不同的方式查看问题,您只需要没有任何未付订单的客户。
sel cus from order group by Cus having min(Paid) = 'Y';
上述查询还利用了'Y'>的事实。 'N'。
SQL小提琴:
http://sqlfiddle.com/#!4/f6022/1
如果您需要为符合条件的客户选择所有不同的订单,您可以使用OLAP功能:
select cus,order,paid from (select cus,order,paid,min(paid)
over (partition by cus)minz from order)dt where minz='Y';
答案 1 :(得分:0)
不了解Oracle,但经常在SQL Server中工作,我会编写类似这样的查询
Select Cus from order group by Cus having count(*) = sum(case when Paid = ‘Y’ then 1 else 0);
基本上,您检索总订单数等于总和或付款订单的客户。
再次,对于没有给出正确的Oracle语法而道歉,但希望这会指向正确的方向。
答案 2 :(得分:0)
使用Oracle,你也可以select customer from your_table where paid='Y' minus select customer from your_table where paid='N'
,虽然我不知道这是否更快,当然,在这种情况下你不会得到其他字段。
答案 3 :(得分:-1)
SELECT *
FROM orders oo
WHERE NOT EXISTS
(
SELECT 1
FROM orders io
WHERE oo.cus# = io.cus#
AND io.paid = 'N'
)
;