5

我有一个包含两列的表 - 客户 ID 和他们购买的产品数量。

我将使用什么 SQL 语句来了解有多少客户购买了 1 种或更多产品、2 种或更多产品、3 种或更多产品等?

这可以在不使用交叉连接的情况下完成吗(我使用的是不支持的 google bigquery)。

4

3 回答 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

依此类推,无论您想要多少类别。

于 2013-06-25T00:07:05.900 回答
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;
于 2013-06-24T23:57:23.800 回答
-1

我不相信使用没有交叉产品的直接 SQL 是可能的。

原因如下——我们关心的折叠操作是使用“group by”。然而 group by 的工作方式是它需要多行并将它们折叠成一行,同时执行一些聚合计算。

要进行这种“一个或多个”分析,一行需要成为多行计算的一部分。即,已购买 10 件产品的用户所在的行必须是“1 或更多”、“2 或更多”、“3 或更多”等行的一部分。没有任何操作可以让您这样做。

于 2013-06-25T00:06:49.820 回答