1
votes

Sélection des identifiants clients qui ont acheté auprès d'un certain canal

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!

sql

3 commentaires

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.


3 Réponses :


0
votes

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'


0 commentaires

0
votes

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) .
  • Vous pouvez attirer des clients qui ont acheté dans aucun canal.
  • Vous pouvez obtenir des informations supplémentaires sur le client, si cela est souhaitable.


1 commentaires

Merci pour l'aide. C'était une excellente façon simple d'obtenir ce dont j'avais besoin!



0
votes

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


0 commentaires