J'essaie de tirer une liste des identifiants clients qui ont acheté en ligne uniquement et une autre liste de ceux qui ont acheté à la fois en ligne et en magasin (aucun client pour en magasin uniquement). J'ai actuellement un tableau qui ressemble à ceci:
------------------------------------------------------- **customerid** **shipped_dt** **channel** 1 2018-10-31 online 1 2018-11-01 store 2 2018-11-01 store 3 2018-11-01 online 3 2018-11-02 online
Dans ce cas, pour la liste avec ceux qui ont acheté à la fois en ligne et en magasin, j'ai été customerid 1. Pour la liste des clients qui sont en ligne uniquement, je veux customerid 3. Comment est-ce que j'écrirais exactement un code pour cela? J'apprends toujours SQL, donc je ne connais pas trop la syntaxe et les capacités appropriées de SQL.
Je veux seulement un retour de l'ID client et du canal par lequel ils ont acheté.
Merci!
3 Réponses :
Juste une alternative mineure
Exemple
customerid Channel 3 online
Remarque: Si vous supprimez et min (Channel) = 'online' vous verriez les clients qui ont acheté via un seul canal
Retours
Select customerid
,Channel = min(Channel)
From YourTable
Group By customerid
Having min(Channel)=max(channel)
and min(Channel)='online'
Si vous avez une liste distincte de clients, vous pouvez utiliser exist :
Par exemple, pour obtenir des clients qui ont acheté aux deux endroits:
select c.*
from customers c
where exists (select 1 from t where t.customer_id = c.customer_id and t.channel = 'online'
) and
exists (select 1 from t where t.customer_id = c.customer_id and t.channel = 'store'
) ;
Cela peut présenter certains avantages par rapport à l'agrégation:
existe et n'existe pas peut utiliser directement un index sur (customer_id, store) . Merci pour l'aide. C'était une excellente façon simple d'obtenir ce dont j'avais besoin!
Pour le cas de "en ligne" , seuls les clients utilisent n'existe pas pour exclure ceux qui ont acheté dans le "magasin" :
select distinct customerid, 'online' channel from tablename t where not exists ( select 1 from tablename where customerid = t.customerid and channel = 'store' ) union all select distinct customerid, 'both' channel from tablename t where (select count(distinct channel) from tablename where customerid = t.customerid) = 2
Pour le cas de 'online' et 'store':
select distinct customerid from tablename t where (select count(distinct channel) from tablename where customerid = t.customerid) = 2
Vous peut combiner les requêtes ci-dessus dans ceci:
select distinct customerid from tablename t where not exists ( select 1 from tablename where customerid = t.customerid and channel = 'store' )
Voir le démo
Comment procéderiez-vous? Ajoutez à la question ce que vous avez essayé.
quels dbms vous utilisez (mysql, postgresql, oracle, sql)?
@Student Qu'avez-vous essayé? Puisque vous apprenez, une bonne stratégie serait d'essayer de le faire vous-même. Google est ton ami.