mysql - 按类别聚合并获得条件计数
问题描述
我的临时权限有 3 列,其中个人按类别 ID 和客户 ID 是唯一的(即跨类别可以有多个相同的客户 ID;客户 ID 不是唯一的)。
类别 ID | 客户ID | 购买次数 |
---|---|---|
X | 一个 | 4 |
X | 乙 | 10 |
X | C | 2 |
是 | 一个 | 2 |
是 | 乙 | 6 |
Z | 一个 | 11 |
Z | C | 5 |
Z | D | 10 |
我正在寻找的输出表基本上是 4 列:按类别 ID 分组,标识至少有 1 次购买的客户总数、至少有 10 次购买的客户以及该类别中所有客户的总购买量。输出表如下所示:
类别_ID | Total_Customers_1 | Total_Customers_10 | Total_Purchases |
---|---|---|---|
X | 3 | 1 | 16 |
是 | 2 | 1 | 8 |
Z | 3 | 2 | 26 |
当我输入以下代码时,我得到了每个类别的正确总购买量列,但是每个类别至少购买 3 次的客户总数不正确,因为所有类别的聚合都是相同的。
我应该如何进行?谢谢您的帮助。
更新:我忘了添加我的代码:
SELECT table.categoryID AS Category_ID
(SELECT COUNT (table.customerID)
FROM table
WHERE table.purchases >=1) AS Total_Customers_1,
(SELECT COUNT (table.customerID)
FROM table
WHERE table.purchases >=10) AS Total_Customers_10,
SUM (table.purchases) AS Total_Purchases,
FROM table
GROUP BY Category_ID, Total_Customers_1, Total_Customers_10,
(PS 当我尝试 GROUP BY Category_ID 时,我得到一个语法不正确的错误,因为我的 SELECT 语句中有子查询。
解决方案
您可以使用条件聚合。
SELECT
category_id,
COUNT(*) AS total_customers_1,
COUNT(DISTINCT CASE WHEN purchases >= 10 THEN customer_id END) AS total_customers_10,
SUM(purchases) AS total_purchases
FROM
yourTable
GROUP BY
category_id
我使用 DISTINCT 作为防御性编程,但如果客户 ID 在任何给定类别中仅存在一次,则不需要。
笔记:
- 没有 ELSE 子句的 CASE 表达式默认为 ELSE NULL
- 聚合,例如 COUNT(),不包括 NULL
推荐阅读
- postgresql - OSX 上的“psql:无法连接到服务器”:没有要删除的 postmaster.pid
- cassandra - 同一集群中的 Scylla 数据中心和 Cassandra 数据中心
- firebase - Firebase 配置错误:参数无效,必须采用 key=val 格式
- ios - FirebaseApp.configure() 在启动时使应用程序崩溃
- javascript - 使用 AVIF 图像格式从 Canvas 创建图像
- scala - 跳过的阶段对 Spark 作业有任何性能影响吗?
- sql-server - 在 SQL 中使用带有 except 的 OFFSet 子句
- python - what is the meaning of writing a number near to write loop
- c - 你能告诉我如何声明这个数组 arr[n[j]]={0}; 全零
- python - nuitka:如何使用--include-plugin-files?