2013-06-24 6 views
5

Ho una tabella con due colonne: ID cliente e numero di prodotti acquistati.Contare su un intervallo di valori in SQL

Quale dichiarazione SQL dovrei utilizzare per sapere quanti clienti hanno acquistato 1 o più prodotti, 2 o più prodotti, 3 o più prodotti ecc.?

Questo può essere fatto SENZA usare Cross Joins (sto usando google bigquery che non supporta quello).

risposta

1

tenta di utilizzare:

SELECT 
CASE NumOfProducts >= 1 THEN 1 
WHEN NumOfProducts >= 2 THEN 2 
WHEN NumOfProducts >= 3 THEN 3 
ELSE 0 
END CASE, 
COUNT(CustomerID) AS cnt 
FROM Customers 
GROUP BY CASE NumOfProducts >= 1 THEN 1 
WHEN NumOfProducts >= 2 THEN 2 
WHEN NumOfProducts >= 3 THEN 3 
ELSE 0 
END; 
+0

Abbastanza vicino; Non penso che sia necessario 'GROUP BY COUNT (NumOfProducts)', solo 'GROUP BY NumOfProducts'. – BellevueBob

+0

true sono già contati, lo modifico – mirkobrankovic

+0

Questo non funziona affatto. La domanda è: quanti clienti acquistano 1 * o più *. Questo dovrebbe essere sottolineato nella domanda. – aloo

-1

io non credo che questo è possibile utilizzando SQL dritto senza cross-product.

Il motivo è il seguente: l'operazione che ci interessa fare collassare è usare "raggruppa per". Tuttavia, il modo in cui raggruppa funziona, richiede più righe e le colloca nella riga una riga durante l'esecuzione di alcuni calcoli aggregati.

Per eseguire questo tipo di analisi "una o più" una riga deve essere parte del calcolo di più righe. Ad esempio, la riga per l'utente che ha acquistato 10 prodotti deve far parte delle righe "1 o più", "2 o più", "3 o più", ecc. Non c'è nessuna operazione che ti consenta di farlo.

4

Se veramente bisogno di contare il numero di clienti che acquistano "uno o più" e "due o più" a parte, avrete bisogno di un CASE espressione:

SELECT SUM(CASE WHEN NumOfProducts >= 1 THEN 1 ELSE 0 END) AS Purchased_1_or_more 
    , SUM(CASE WHEN NumOfProducts >= 2 THEN 1 ELSE 0 END) AS Purchased_2_or_more 
    , SUM(CASE WHEN NumOfProducts >= 3 THEN 1 ELSE 0 END) AS Purchased_3_or_more 
    , SUM(CASE WHEN NumOfProducts >= 4 THEN 1 ELSE 0 END) AS Purchased_4_or_more 
    , SUM(CASE WHEN NumOfProducts >= 5 THEN 1 ELSE 0 END) AS Purchased_5_or_more 
FROM Customers 

E così via per tuttavia molti categorie che vuoi

+0

Sì, ma penso che il poster abbia bisogno di questo per tutti i possibili valori di N, non solo 1..5 – aloo