mysql - 处理 group by 子句中的逗号分隔值
问题描述
我有一个名为的列purchasetype
,其中包含三种值new
,我正在根据
我正在使用的查询
计算总数中trial
的new,trial
另一列noofsales
purchasetype
Select SUM(noofsales)
From table
GroupBy purchasetype
这个查询给了我 3 种总和结果new
,
我想要总和,并且trial
只有当一个记录包含时,一个计数应该增加,并且一个计数应该增加,因为
我尝试使用 substring_index 函数,如 new,trial
new
trial
new,trial
new
trial
Select SUM(noofsales)
From table
Groupby substring_index(PurchaseType, ',', 0)
但这只总结了逗号分隔值的第一条记录。
解决方案
您可以即时创建一个数字表,并使用它将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 ...)
推荐阅读
- java - 字符串到对象映射中的漏洞
- node.js - mongoose 使用 SSL 数字海洋与 CA_CERT 连接
- json - 如何将json数据插入postgres数据库表
- python - 查找具有最大值的字典键
- html - 网格布局表单中的元素不会对齐
- ruby-on-rails - 从暂存站点 Nginx 服务器配置中删除 SSL 证书
- java - 从其他应用程序导航时如何通知recyclerview适配器更改
- github - GitHub API v3 Repsonse 基于 Token 的不同
- rust - 减少借用检查器问题的函数签名
- notepad++ - 如何使用正则表达式查找单词并将其复制到特定位置?