2016-08-17 32 views
0

我有一個表Customers和一個表Customercards。一個客戶可以有多個客戶卡。表Customercards通過customer_id引用客戶。按發生值的組數

我想編寫一個查詢其計數customercards每個客戶,並打印出結果,由卡的數量進行分組,這樣的:

cards count 
0  50  
1  37 
2  13 
3  5 
4  1 

目前,我有與計數客戶查詢給定數量的卡使用group byhaving。但我必須多次使用此查詢來計算不同數量的客戶卡。例如:

SELECT c.customer_id 
FROM CUSTOMERS c JOIN CUSTOMERCARDS cc ON c.customer_id = cc.customer_id 
group by c.customer_id 
having count(*) = 2; 

有沒有辦法把它放到一個查詢中?

回答

1

我稱之爲「直方圖直方圖」查詢。您可以使用兩種聚合:

SELECT cnt, COUNT(*), MIN(customer_id), MAX(customer_id) 
FROM (SELECT c.customer_id, COUNT(*) as cnt 
     FROM CUSTOMERS c JOIN 
      CUSTOMERCARDS cc 
      ON c.customer_id = cc.customer_id 
     GROUP BY c.customer_id 
    ) c 
GROUP BY cnt 
ORDER BY cnt; 

我包括最小和最大的客戶ID,只是因爲我覺得用剛纔的例子,當我做這樣的查詢。

注意:您實際上並不需要JOIN,這樣你就可以簡化這個到:

SELECT cnt, COUNT(*), MIN(customer_id), MAX(customer_id) 
FROM (SELECT cc.customer_id, COUNT(*) as cnt 
     FROM CUSTOMERCARDS cc 
     GROUP BY cc.customer_id 
    ) c 
GROUP BY cnt 
ORDER BY cnt; 
+0

謝謝,這正是我一直在尋找。我很困惑與這兩個小組一起工作。現在它工作:) – htz