2017-09-13 54 views
2

我有兩張桌子。如何檢索具有不是最多次數的值的表中的行?

A customers表和orders表。

customers:       orders: 
customer_id  customer_name  orders_id customer_id 
1111    Charles   1020  1111 
2222    Bertram   1021  1111 
3333    Barbare   1022  2222 
            1023  3333 

我所要的輸出是:

customer_name 
Bertram 
Barbara 

我想是因爲他們還沒有下訂單的時候最高的數字只檢索從BertramBarbara的順序。

這裏的問題是子查詢。我知道如何計算客戶下訂單的次數,但我在選擇發生次數最少的customer_id時遇到實際困難。

根據您的樣本數據使用MySQL和Apache

+2

請指定db引擎,例如SQL服務器,甲骨文,PostgreSQL的? – gordy

+2

最少的時間是相對的。最少比較什麼?如果一個客戶有100個訂單,另一個有40個,另一個有30個,另一個有10個,他們都少於最大訂單數量(100個),但您需要選擇多少?你需要訂單數量最少的顧客嗎?! –

+0

你想獲取一列('customer_name')嗎?知道如果我們必須對記錄進行分組很重要。 – 2017-09-13 23:21:01

回答

0

,你可能會發現客戶只需一個順序,你可以使用下面的查詢

SELECT customer_name 
    FROM customer c 
    JOIN orders o 
    ON c.customer_id = o.customer_id 
GROUP BY customer_name 
HAVING COUNT(orders_id) = 1 

結果

customer_name 
Bertram 
Barbara 
+0

正如我所說,根據樣本數據,OP可能會根據他的預期計數數量來更改條件 –

+0

您有權利。我沒有閱讀文字。我的錯。 – 2017-09-13 23:26:42

+0

不用擔心@aendeerei –

0

由於您沒有指定您正在使用的數據庫,我假設您被標準SQL卡住(分析函數不可用)。然後,你可以依靠的所有操作:

WITH count_table AS (SELECT customer_id, COUNT(*) AS num_of_orders 
        FROM your_table 
        GROUP BY customer_id) 
SELECT * 
FROM count_table 
WHERE num_of_orders <= ALL(SELECT num_of_orders FROM count_table) 
0

我會用rank()用於此目的:

select oc.* 
from (select o.customer_id, count(*) as cnt, 
      rank() over (order by count(*) asc) as seqnum 
     from orders o 
     group by o.customer_id 
    ) oc 
where seqnum = 1; 

這不返回的名稱。但獲取名稱是一個簡單的連接。

0

我終於解決了!

SELECT c.customer_id COUNT(o.order_id) "Orders" 
    FROM orders o 
    INNER JOIN customers c 
    ON (o.customer_id = c.customer_id) 
    GROUP BY o.customer_id 
    HAVING Orders < ANY 
         (SELECT COUNT(ord.customer_id) 
         FROM orders ord 
         GROUP BY ord.customer_id) 
相關問題