SQL Query用于评估多行

时间:2013-06-21 22:06:07

标签: sql oracle oracle11g

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

答案 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'
        )
;