2013-07-10 3 views
0

permet de dire que j'ai une table qui a les colonnes suivantes:SQL - Grouper par la requête

customerId, productId

Ce que je veux voir est si j'ai 100.000 clients que je veux les regrouper si je peux voir X nombre de clients ont Y nombre de produits. Par exemple, 2 000 clients peuvent avoir 5 achats, 1 000 clients ont 4 produits, 10 clients peuvent avoir 25 produits, etc. Comment regrouper mes achats en fonction du nombre de clients X?

La base de données est Oracle.

Exemple ensemble de données:

customerID productId 
---------- ---------- 
12345  33035 
12345  33049 
12345  33054 
56789  32777 
56789  32897 
56789  32928 
56789  32958 
56789  33174 
56789  33175 
56789  33410 
56789  35101 
67890  32777 
67890  32897 
67890  32928 
67890  32958 
67890  33174 
67890  33175 
67890  33410 
67890  35101 
    45678  33035 
    45678  33289 
    45678  34354 
    45678  36094 
23456  32778 
23456  33047 
23456  33051 
34567  32776 
34567  32778 
34567  33162 

Il en résulte ce groupe (basés sur les données ensemble) où il y a 3 clients avec 3 produits, 2 clients avec 8 produits et 1 client avec 4 produits. J'ai essayé un tas de déclarations par groupe, mais il me manque quelque chose. Toute aide serait grandement appréciée.

Merci

+0

Pouvez-vous montrer quelques exemples de données? Et quel RDBMS utilisez-vous? –

Répondre

2
SELECT 
    COUNT(CustomerID) AS number_customers, 
    number_products 
FROM (
    SELECT CustomerID, 
    COUNT(ProductID) AS number_products 
    FROM tableName 
    GROUP BY customerID 
) subquery 
GROUP BY number_products 
+0

La "sous-requête AS" est-elle nécessaire? Avec elle inclus la requête a une erreur, mais quand je supprime cette partie, il fonctionne très bien. Merci! – ssbsts

0
Select CustomerID, count(ProductID) 
FROM tableName 
group by customerID 
having count(ProductID) > 25 

maintenant si vous voulez compter que des produits distincts ...

Select CustomerID, count(distinct ProductID) 
    FROM tableName 
    group by customerID 
    having count(ProductID) > 25 

En supposant que vos données contiennent des clients 1 indiquer à chaque fois par produit et que plusieurs clients peuvent être liés à le même produit.

+0

Désolé si ma question n'était pas complètement claire. C'est quelque chose que j'ai essayé, mais qui ne me fait malheureusement qu'une partie du chemin. Avec cela, j'obtiens le nombre de produits pour chaque client. Mais ce que je veux vraiment, c'est regrouper ces chiffres pour que je puisse voir qu'il y a 1500 clients qui ont 5 produits par exemple, pas seulement ce client qui a 5 produits. – ssbsts

0
create table cust_pur as select floor(dbms_random.value(1,21)) customer_id,   floor(dbms_random.value(1,21)) product_id from dual connect by level <= 100 order by customer_id 

select * from cust_pur order by customer_id 


with k1 as (
select distinct(customer_id), count(product_id) over (partition by customer_id) cnt from cust_pur order by customer_id 
) 
select count(customer_id),cnt from k1 group by cnt 
Questions connexes