2014-09-10 76 views
1

我在這個MySQL查詢問題中有點遺失,這涉及到計算由交付客戶訂單的分支分組的每個實例cust.category。如果客戶在同一個月內有多個訂單,則根據他們可能進行的訂單數量來添加cust.category。是否有可能將cust.category的計數限制爲僅用於的唯一用戶?MYSQL:只在用戶是唯一的情況下計數類別實例

樣品表

Customer table 
    id name category nearestbranch created    
------ ------ --------- ------------- ------------------- 
    1 John Engineer    3 2014-09-10 18:10:10 
    2 Mary Developer    4 2014-09-10 18:10:10 
------------------------------------------------------------- 

Orders table 
    id delivery_date customer_id 
------ ------------- ----------- 
    1 2014-09-01    1 
    2 2014-09-02    2 
    3 2014-09-03    1 
----------------------------------- 

我的查詢:

SELECT cust.nearestbranch, 
    SUM(IF(cust.category = 'Engineer', 1, 0)) eng, 
    SUM(IF(cust.category = 'Developer', 1, 0)) dev 
    FROM customers cust 
    LEFT JOIN orders ON cust.id = orders.customer_id 
    WHERE DATE_FORMAT(orders.delivery_date, '%Y-%m') = '2014-09' 
    GROUP BY cust.nearestbranch 

代替,但得到這個(ENG = 1)

nearestbranch  eng dev 
------------- ------ ------ 
      3  1  0 
      4  0  1 

我得到這個(ENG = 2)

nearestbranch  eng dev 
------------- ------ ------ 
      3  2  0 
      4  0  1 

回答

0

使用count(distinct)與案件因此對於每一個類別,你將有不同用戶

SELECT cust.nearestbranch, 
    COUNT(distinct case when cust.category = 'Engineer' then customer_id end) eng, 
    COUNT(distinct case when cust.category = 'Developer'then customer_id end) dev 
    FROM customers cust 
    LEFT JOIN orders ON cust.id = orders.customer_id 
    WHERE DATE_FORMAT(orders.delivery_date, '%Y-%m') = '2014-09' 
    GROUP BY cust.nearestbranch 

Demo

+0

驚人的算!有用。雖然我對使用'distinct'非常謹慎。它沒有使用更多的資源,或者我聽說過嗎? – enchance 2014-09-11 14:20:19

+0

@enchance我想我不會影響你的查詢爲什麼不在你的生產服務器上運行這個查詢也在on子句中索引列會更好,還要改變where子句'WHERE orders.delivery_date> ='2014-09-01 'AND orders.delivery_date <='2014-09-30''如果你有一個索引on delivery_date,這個where子句將使用它,因爲你當前的索引不會被使用看到[* sargable *])(http ://en.wikipedia.org/wiki/Sargable)以供參考,問候 – 2014-09-11 14:41:09

相關問題