0

我想只从订单表中检索已支付所有订单的客户。(付费 = '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)。

如何构建查询以评估客户的所有订单并仅返回已支付所有订单的客户的信息?

4

4 回答 4

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';
于 2013-06-21T23:00:38.807 回答
0

不了解 Oracle 但经常在 SQL Server 中工作,我会编写类似这样的查询

Select Cus from order group by Cus having count(*) = sum(case when Paid = ‘Y’ then 1 else 0);

基本上,您检索总订单数等于总订单数或已付款订单的客户。

再次,为没有提供正确的 Oracle 语法而道歉,但希望这将为您指明正确的方向。

于 2013-06-21T22:10:40.327 回答
0

使用 Oracle,您也可以这样做select customer from your_table where paid='Y' minus select customer from your_table where paid='N',尽管我不知道这是否更快,当然,在这种情况下您不会获得其他字段。

于 2013-06-21T22:44:01.467 回答
-1
SELECT  *
FROM    orders oo
WHERE   NOT EXISTS
        (
            SELECT  1
            FROM    orders io
            WHERE   oo.cus# = io.cus#
            AND     io.paid = 'N'
        )
;
于 2013-06-22T10:11:48.343 回答