2013-06-24 62 views
5

我有一個包含兩列的表格 - 客戶ID和他們購買的產品數量。在SQL中的一系列值上進行計數

我會用什麼SQL語句來了解有多少客戶購買了1個或更多產品,2個或更多產品,3個或更多產品等?

這可以做到沒有使用交叉連接(我使用谷歌bigquery不支持)。

回答

1

嘗試使用:

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

非常接近;我不認爲你需要'GROUP BY COUNT(NumOfProducts)',只需'GROUP BY NumOfProducts'。 – BellevueBob

+0

真的,他們已經計算好了,我會編輯它 – mirkobrankovic

+0

這根本不起作用。問題是有多少客戶購買1 *或更多*。這個問題應該強調一下。 – aloo

-1

我不相信這是可能使用直SQL無交叉的產物。

原因在於 - 我們關心的摺疊操作是使用「group by」。然而,按工作方式分組的方式是,需要多行,並在執行某些聚合計算時將它們拆分爲一個行。

要做這種「一個或多個」分析,一行需要成爲多行計算的一部分。即已購買10種產品的用戶的行需要成爲「1個或更多」,「2個或更多」,「3個或更多」等行的一部分。沒有操作可以讓你這樣做。

4

如果你真的需要數數誰購買「一個或多個」客戶數量「兩個或多個」獨立,你需要一個CASE表達:

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 

等了然而,許多你想要的類別。

+0

是的,但我認爲海報需要這個N值的所有可能值,而不僅僅是1..5 – aloo

相關問題