我有一個包含兩列的表格 - 客戶ID和他們購買的產品數量。在SQL中的一系列值上進行計數
我會用什麼SQL語句來了解有多少客戶購買了1個或更多產品,2個或更多產品,3個或更多產品等?
這可以做到沒有使用交叉連接(我使用谷歌bigquery不支持)。
我有一個包含兩列的表格 - 客戶ID和他們購買的產品數量。在SQL中的一系列值上進行計數
我會用什麼SQL語句來了解有多少客戶購買了1個或更多產品,2個或更多產品,3個或更多產品等?
這可以做到沒有使用交叉連接(我使用谷歌bigquery不支持)。
嘗試使用:
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;
我不相信這是可能使用直SQL無交叉的產物。
原因在於 - 我們關心的摺疊操作是使用「group by」。然而,按工作方式分組的方式是,需要多行,並在執行某些聚合計算時將它們拆分爲一個行。
要做這種「一個或多個」分析,一行需要成爲多行計算的一部分。即已購買10種產品的用戶的行需要成爲「1個或更多」,「2個或更多」,「3個或更多」等行的一部分。沒有操作可以讓你這樣做。
如果你真的需要數數誰購買「一個或多個」客戶數量「兩個或多個」獨立,你需要一個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
等了然而,許多你想要的類別。
是的,但我認爲海報需要這個N值的所有可能值,而不僅僅是1..5 – aloo
非常接近;我不認爲你需要'GROUP BY COUNT(NumOfProducts)',只需'GROUP BY NumOfProducts'。 – BellevueBob
真的,他們已經計算好了,我會編輯它 – mirkobrankovic
這根本不起作用。問題是有多少客戶購買1 *或更多*。這個問題應該強調一下。 – aloo