2013-06-21 91 views
0

我想只從支付所有訂單的訂單表中檢索客戶。 (付費='Y')。用於評估多行的SQL查詢

順序表看起來像這樣:

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'; 
已支付的

回報客戶和訂單無償(例如客戶222)以及支付所有訂單的客戶(客戶111)。

如何構建查詢以評估客戶的所有訂單,並僅爲已支付所有訂單的客戶返回信息?

+0

是否有超過三種可能的值爲付費欄目?如果沒有,你應該使用布爾數據類型,而不是字符串。 –

回答

0

不知道甲骨文,但在SQL Server經常加班,我會寫的查詢是這樣的

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

基本上你檢索客戶那裏總訂單數等於總結或支付的訂單。

再次,道歉不給予適當的Oracle語法,但希望這會指出你正確的方向。

0

對於Oracle,您也可以執行select customer from your_table where paid='Y' minus select customer from your_table where paid='N',但我不知道這是否更快,當然,在這種情況下您還沒有得到其他字段。

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'; 
+0

比我的回答更好! –

-1
SELECT * 
FROM orders oo 
WHERE NOT EXISTS 
     (
      SELECT 1 
      FROM orders io 
      WHERE oo.cus# = io.cus# 
      AND  io.paid = 'N' 
     ) 
; 
+1

子查詢不是必需的,並在這裏推薦..請務必在必要時使用SubQs .. !! – user2407394

+0

它適用於「選擇*從」這就是爲什麼它是必要的。 「並不總是需要但通常建議」EXISTS「。 –

+0

任何subq方法都會增加處理時間,請考慮表中包含數百萬行的情況。 OP沒有提及他是否需要具有不同#值的所有列。無論如何,情況是如此,可以通過使用PLAP> – user2407394