首页 > 解决方案 > 按类别聚合并获得条件计数

问题描述

我的临时权限有 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 语句中有子查询。

标签: mysqlsqlgroup-by

解决方案


您可以使用条件聚合。

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

推荐阅读