2016-05-28 2 views
1

を数えるSTORE_ID CUSTOMER_IDを数えることができます。は、どのように私はダウンのようなDBを持っている以上1

+---+-------------+---------- 
|id | customer_id | store_id| 
+---+-------------+---------- 
|1 | 1   | 1001| 
|2 | 1   | 1002| 
|3 | 1   | 1001| 
|4 | 1   | 1003| 
|5 | 2   | 1001| 
|6 | 2   | 1001| 
|7 | 3   | 1001| 
|8 | 3   | 1002| 
|9 | 3   | 1001| 
|10 | 4   | 1003| 
|11 | 4   | 1001| 
|12 | 4   | 1002| 
+---+-------------+---------- 

私はEXPの値が1よりも多くの異なるshop_idを(買物場所の異なるCUSTOMER_IDをカウントしたい1つのショッピング1001 CUSTOMER_ID。 、1002およびcustomer_id 4ショッピング1001,1002,1003およびcustomer_id 3ショッピング1001,1002、customer_id 2のみショッピング1001)

答えて

1

ネストされたクエリを使用できます。内側のクエリは、複数のストアIDを持つ顧客IDのみをフィルタリングし、外側の人はそれを数える:

SELECT COUNT(*) 
FROM (SELECT customer_id 
     FROM  my_table 
     GROUP BY customer_id 
     HAVING COUNT(DISTINCT store_id) > 1) t 

内部クエリのgroup byは既に別個の顧客IDを返しているため、外部クエリはcount呼び出しでdistinctを必要としないことに注意してください。

select count(distinct customer_id) 
from t 
where exists (select 1 
       from t t2 
       where t2.customer_id = t.customer_id and 
        t2.store_id <> t.store_id 
      ); 

この:

+1

素晴らしい!ご回答有難うございます –

0

使用サブクエリは、ここで

SELECT COUNT(*) 
FROM (SELECT count(*) cnt 
     FROM my_table 
     GROUP BY customer_id 
    ) t 
WHERE cnt > 1 
0

つ以上が集合の一つだけのレベルを持っている方法であるカウントごとCUSTOMER_IDためSTORE_IDをカウントし、それに行をカウントしますクエリはt(customer_id, store_id)のインデックスを利用できるはずです。これによりパフォーマンスが向上する可能性があります。

関連する問題