2017-03-29 5 views
0

J'ai deux tables avec le schéma suivantJoindre deux tables pour aller chercher compter

GROUP_ID | PURCHASE_ID |ITEMS ---> TABLE1 
    1   21   X 
    1   21   Y 
    1   21   Z 
    2   22   X 


GROUP_ID |CUSTOMER_ID |ITEMS --->TABLE2 
1    ABC  X 
1    ABC  Y 
1    ABC  Z 
1    ABC  A 
1    ABC  B 

Un seul GROUP_ID et PURCHASE_ID peut avoir plusieurs éléments et de même un seul GROUP_ID et CUSTOMER_ID peuvent avoir plusieurs items.The nombre d'éléments acheté sera seulement deux ou trois par GROUP_ID et par PURCHASE_ID mais un CUSTOMER_ID donné, GROUP_ID peut avoir un certain nombre d'éléments.

Je souhaite interroger pour chaque GROUP_ID et PURCHASE_ID et ITEMS [set], combien de clients ont acheté au moins tous les ITEMS.

select distinct GROUP_ID,PURCHASE_ID,count(object_id)over(partition by GROUP_ID,PURCHASE_ID) from 
     (select a.GROUP_ID GROUP_ID,a.PURCHASE_ID PURCHASE_ID,b.CUSTOMER_ID object_id from  
     (select GROUP_ID,PURCHASE_ID,items,count(items)over(partition by GROUP_ID,PURCHASE_ID) val from TABLE1)a, 
     (select GROUP_ID,CUSTOMER_ID,ITEMS from TABLE2)b 
     where a.GROUP_ID=b.GROUP_ID and a.items=b.ITEMS and val=3 
     group by a.GROUP_ID,a.PURCHASE_ID,b.CUSTOMER_ID 
     having count(*)=3) 

Pour les données fournies ci-dessus pour GROUP_ID = 1 et PURCHASE_ID = 21 le nombre devrait être 1 car il existe un client avec ID ABC qui a le sous-ensemble d'éléments [X, Y, Z] I AVONS code écrit pour aller chercher le nombre de clients pour trois articles comme ci-dessus. Y a-t-il un moyen d'optimiser cela ou d'y parvenir?

Toute aide est très appréciée

+0

Votre question peut bénéficier grandement de fournir des exemples de données pour chaque table, puis la sortie attendue. – Anand

+0

@Anand J'ai ajouté les entrées et sorties attendues –

Répondre

0

Ceci est une question délicate; Je me joins habituellement les deux tables sur toutes les colonnes nécessaires et cherche comptes distincts pour correspondre comme ceci:

select t1.group_id, 
    t1.purchase_id, 
    count(distinct t2.customer_id) as customer_count 
from Table1 as t1 
inner join Table2 as t2 
on t2.group_id = t1.group_id 
and t2.items = t1.items 
group by t1.group_id, 
    t1.purchase_id 
having count(distinct t2.items) >= count(distinct t1.items) 

Ce n'est pas testé donc essayez et laissez-moi savoir si cela fonctionne ou non.