2013-05-02 36 views
0

我有一個SQL表叫main_tableCOUNT DISTINCT重複內的組在MySQL

 
id | product_id | purchase_id | purchaser_id 
---+------------+-------------+------------- 
1 |   1 |   1 |   1 
2 |   1 |   2 |   1 
3 |   1 |   3 |   1 
4 |   1 |   4 |   2 
5 |   1 |   5 |   2 
6 |   1 |   6 |   3 
7 |   2 |   1 |   1 
8 |   2 |   4 |   2 
9 |   2 |   5 |   2 
10 |   2 |   7 |   2 
11 |   2 |   8 |   2 
12 |   2 |   6 |   3 
13 |   2 |   9 |   3 
14 |   2 |   10 |   3 
15 |   2 |   11 |   3 
16 |   2 |   12 |   4 
17 |   2 |   13 |   4 

我需要組由product_id,並找到了四件事情:

  • #購買
  • #買家
  • #重複購買
  • #重複購買者

所以第3是比較簡單的...

SELECT FROM `main_table` 
    product_id, 
    COUNT(DISTINCT `purchase_id`) AS `purchases`, 
    COUNT(DISTINCT `purchaser_id`) AS `purchasers`, 
    (COUNT(DISTINCT `purchase_id`) - COUNT(DISTINCT `purchaser_id`)) AS `repeat_purchases`, 
    (??????) AS `repeat_purchasers` 
GROUP BY product_id 
ORDER BY product_id ASC 

什麼是爲了得到下表中??????

product_id | purchases | purchasers | repeat_purchases | repeat_purchasers 
-----------+-----------+------------+------------------+------------------ 
     1 |   6 |   3 |    3 |    2 
     2 |  11 |   4 |    7 |    3 
+0

你是如何設置'repeat_purchasers' 2和3?邏輯? – hims056 2013-05-02 05:52:39

+0

邏輯是在這個問題的定義:(如果我有邏輯我不會問這個問題... – shadowice222 2013-05-02 06:06:31

+0

@ shadowice222-通過邏輯我的意思是你爲什麼寫2和3,而不是4和5? – hims056 2013-05-02 06:08:18

回答

1
SELECT a.product_id, 
     COUNT(DISTINCT a.purchase_id) AS purchases, 
     COUNT(DISTINCT a.purchaser_id) AS purchasers, 
     (COUNT(DISTINCT a.purchase_id) - COUNT(DISTINCT a.purchaser_id)) AS repeat_purchases, 
     COALESCE(c.totalCount,0) AS repeat_purchasers 
FROM main_table a 
     LEFT JOIN 
     (
      SELECT product_id, COUNT(totalCOunt) totalCount 
      FROM  
        (
         SELECT product_id, purchaser_id, COUNT(*) totalCOunt 
         FROM main_table 
         GROUP BY product_id, purchaser_id 
         HAVING COUNT(*) > 1 
        ) s 
      GROUP BY product_id 
     ) c ON a.product_id = c.product_id 
GROUP BY product_id 

輸出

╔════════════╦═══════════╦════════════╦══════════════════╦═══════════════════╗ 
║ PRODUCT_ID ║ PURCHASES ║ PURCHASERS ║ REPEAT_PURCHASES ║ REPEAT_PURCHASERS ║ 
╠════════════╬═══════════╬════════════╬══════════════════╬═══════════════════╣ 
║   1 ║   6 ║   3 ║    3 ║     2 ║ 
║   2 ║  11 ║   4 ║    7 ║     3 ║ 
╚════════════╩═══════════╩════════════╩══════════════════╩═══════════════════╝ 
+0

你正在使用哪種工具格式化這樣的表格(輸出)? – hims056 2013-05-02 06:01:27

0

我會做這樣的事情:

select a.product_id, count(*) as purchases, count(distinct(a.purchaser_id)) as 
purchasers, count(*) - count(distinct(a.purchaser_id)) as repeat_purchases, 
b.repeat_purchasers from main_table a, 
(select x.product_id, count(*) as repeat_purchasers from 
    (select y.product_id, y.purchaser_id from main_table y 
    group by y.purchaser_id, y.product_id having y.count > 1) x 
group by x.product_id) b group by 
a.product_id,b.repeat_purchasers,b.product_id having 
a.product_id = b.product_id` 

這基本上是一樣的約翰,但沒有JOIN