You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MySQL中JSON类型字段的分组聚合求和实现问题

解决MySQL JSON字段分组聚合求和问题

我来帮你搞定这个JSON字段的分组求和需求~首先,你的Sample表中details是JSON类型,而且示例里的数值(比如amount)是字符串格式,所以我们需要先把JSON中的字段提取出来并转换成数值类型,再结合GROUP BY做聚合。

步骤1:提取并转换JSON字段

首先,我们需要从details中提取需要的字段(比如nameamountpercentage),并把字符串类型的数值转换成可计算的数值类型:

SELECT
  -- 提取name字段,去除JSON引号
  JSON_UNQUOTE(details->>'$.name') AS name,
  -- 提取amount并转成DECIMAL类型,方便求和
  CAST(JSON_UNQUOTE(details->>'$.amount') AS DECIMAL(10,2)) AS amount,
  -- 提取percentage并转成INT类型
  CAST(JSON_UNQUOTE(details->>'$.percentage') AS INT) AS percentage
FROM Sample;

这里->>是MySQL 5.7+支持的语法,等价于JSON_UNQUOTE(JSON_EXTRACT(details, '$.字段名')),能直接提取不带引号的字段值。

步骤2:结合GROUP BY实现分组求和

假设你要按percentage分组,计算每个百分比对应的总金额,只需要在上面的查询基础上加上GROUP BYSUM聚合函数:

SELECT
  CAST(JSON_UNQUOTE(details->>'$.percentage') AS INT) AS percentage,
  SUM(CAST(JSON_UNQUOTE(details->>'$.amount') AS DECIMAL(10,2))) AS total_amount
FROM Sample
GROUP BY percentage;

如果需要按name分组求和,只需要把GROUP BY的字段换成name即可:

SELECT
  JSON_UNQUOTE(details->>'$.name') AS name,
  SUM(CAST(JSON_UNQUOTE(details->>'$.amount') AS DECIMAL(10,2))) AS total_amount
FROM Sample
GROUP BY name;

处理特殊情况

如果有些记录的details字段可能为NULL,或者某个JSON字段不存在,可以用COALESCE来避免计算出错:

SELECT
  COALESCE(CAST(JSON_UNQUOTE(details->>'$.percentage') AS INT), 0) AS percentage,
  SUM(COALESCE(CAST(JSON_UNQUOTE(details->>'$.amount') AS DECIMAL(10,2)), 0)) AS total_amount
FROM Sample
GROUP BY percentage;

额外:如果details是JSON数组的情况

如果你的details字段是包含多个对象的JSON数组(比如一条记录对应多个金额条目),可以用JSON_TABLE来展开数组再分组:

SELECT
  jt.category,
  SUM(CAST(jt.amount AS DECIMAL(10,2))) AS total_amount
FROM Sample,
     JSON_TABLE(
       details,
       '$[*]' COLUMNS(
         amount VARCHAR(20) PATH '$.amount',
         category VARCHAR(50) PATH '$.category'
       )
     ) AS jt
GROUP BY jt.category;

内容的提问来源于stack exchange,提问作者Anandhakumar R

火山引擎 最新活动