【问题标题】:Dealing with comma separated value in group by clause处理 group by 子句中的逗号分隔值
【发布时间】:2019-01-22 11:13:01
【问题描述】:

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

   Select SUM(noofsales) 
     From table 
  GroupBy purchasetype

这个查询给了我 3 种求和结果 new,trialnew,trial
我想要newtrial 的总和,只有当一条记录包含new,trial 时,new 的计数应该增加,trial 的计数也应该增加
我尝试过使用像

这样的 substring_index 函数
Select SUM(noofsales) 
     From table 
  Groupby substring_index(PurchaseType, ',', 0)

但这只是对逗号分隔值中的第一条记录进行总结。

【问题讨论】:

标签: mysql


【解决方案1】:

在您的情况下,您可以对每个总和使用 CASE/WHEN 语句。例如:

SELECT query with CASE condition and SUM()

【讨论】:

  • 购买类型有这么多的值,我只是举了一个简单的例子
  • 我们不能通过改变group by子句来做到吗?
【解决方案2】:

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

考虑以下查询,您可以在 this 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 ...)

【讨论】:

    猜你喜欢
    • 2013-10-20
    • 2011-11-18
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多