【问题标题】:Generating table with SUM columns based on different conditions根据不同条件生成带有 SUM 列的表
【发布时间】:2021-11-08 10:21:33
【问题描述】:

我对 SQL 还很陌生,我正在努力根据某些过滤器生成一个包含多个聚合的表。

我的临时权限有 3 列个人在类别 ID 和客户 ID 上是唯一的(即跨类别可以有多个相同的客户 ID)

Category ID Customer ID Number of Purchases
X A 4
X B 10
X C 2
Y A 2
Y E 6
Z A 10
Z C 5
Z D 7

我要查找的输出表基本上是 4 列:按类别 ID 分组标识 至少有 3 次购买的客户总数至少有 5 次购买以及该类别中所有客户的总购买次数。输出表如下所示:

Category_ID Total_Customers_3 Total_Customers_5 Total_Purchases
X 2 1 16
Y 1 1 8
Z 3 3 22

当我输入以下代码时,我得到了每个类别的正确总购买量列,但每个类别至少购买 3 次的客户总数不正确,因为所有类别的汇总都是相同的。

我的代码:

SELECT table.categoryID AS Category_ID
       (SELECT COUNT (table.customerID)
               FROM table
               WHERE table.purchases >=3) AS Total_Customers_3,
       (SELECT COUNT (table.customerID)
               FROM table
               WHERE table.purchases >=5) AS Total_Customers_5,
       SUM (table.purchases) AS Total_Purchases,
FROM table
GROUP BY Category_ID, Total_Customers_3, Total_Customers_5,

(P.S 当我尝试只使用 GROUP BY Category_ID 时,我收到一个错误,指出语法不正确,因为我的 SELECT 语句中有子查询。

不正确的表格(即所有类别中满足条件的客户总数相同)如下所示:

Category_ID Total_Customers_3 Total_Customers_5 Total_Purchases
X 2 1 16
Y 2 1 8
Z 2 1 22

更新:我应该在原始问题中包含此内容,但我实际上希望根据 2 个条件在相同的客户总数中生成 2 列 - 一个用于至少 3 次购买的客户,另一列对于至少有 5 位客户的客户。

【问题讨论】:

    标签: mysql sql group-by subquery aggregates


    【解决方案1】:

    按类别聚合,使用条件聚合得到计数和总数。

    SELECT
        Category_ID,
        SUM(purchases >= 3) Total_Customers_3,
        SUM(CASE WHEN purchases >= 3 THEN purchases ELSE 0 END) AS Num_Purchases_3,
        SUM(purchases >= 5) Total_Customers_5,
        SUM(CASE WHEN purchases >= 5 THEN purchases ELSE 0 END) AS Num_Purchases_5
    FROM yourTable
    GROUP BY Category_ID;
    

    Demo

    【讨论】:

    • 谢谢,蒂姆。如果我需要根据同一张表中的 2 个不同条件为 Total_Customers 生成 2 列怎么办?所以购买量 >=3 以及购买量 >=5。我忽略了这一点,但我意识到这会改变我失败的整个方法。
    • 这不是你问的,也不是我回答的。您可以使用条件聚合,例如SUM(CASE WHEN purchases >= 5 THEN purchase ELSE 0 END) ...我不会更新我的答案。
    • 对不起,我还在习惯使用堆栈溢出。感谢您的帮助。
    • @AL0290 我已经回答了你上面的第二个问题,看看。请不要在其他人回答后大幅更改您的问题。已经存在的答案可能已经过测试并付出了一些努力,而您更改问题会迫使每个人重新回答一个问题。
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多