首页 > 解决方案 > 处理 group by 子句中的逗号分隔值

问题描述

我有一个名为的列purchasetype,其中包含三种值new,我正在根据 我正在使用的查询 计算总数中trialnew,trial另一列noofsales
purchasetype

   Select SUM(noofsales) 
     From table 
  GroupBy purchasetype

这个查询给了我 3 种总和结果new, 我想要总和,并且trial只有当一个记录包含时,一个计数应该增加,并且一个计数应该增加,因为 我尝试使用 substring_index 函数,如 new,trial
newtrialnew,trialnewtrial

Select SUM(noofsales) 
     From table 
  Groupby substring_index(PurchaseType, ',', 0)

但这只总结了逗号分隔值的第一条记录。

标签: mysql

解决方案


您可以即时创建一个数字表,并使用它将purchase_type逗号分隔值的记录转换为新行。然后在外部查询中您可以正确聚合。

考虑以下查询,您可以在此 db fiddle中看到该查询。它将动态发现可用的购买类型并生成您期望的结果:

SELECT x.purchase_type, SUM(x.noofsale)
FROM (
    SELECT
        t.noofsale,
        SUBSTRING_INDEX(SUBSTRING_INDEX(t.purchase_type, ',', numbers.n), ',', -1) purchase_type
    FROM
        (SELECT 1 n UNION SELECT 2) numbers 
        INNER JOIN t ON CHAR_LENGTH(t.purchase_type) - CHAR_LENGTH(REPLACE(t.purchase_type, ',', ''))>= numbers.n-1
) x
GROUP BY x.purchase_type
ORDER BY 1,2

注意:此查询最多支持两个逗号分隔值(如您的示例数据所示);如果您期望更多,您可以调整numbers子查询:

(SELECT 1 n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 ...)

推荐阅读