Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Soma agregada do MySQL de objetos JSON


Atualização:ok

Primeiro, eu definitivamente recomendaria normalizar um pouco os dados. Você já tentou armazenar apenas os objetos na coluna de detalhes? Se você precisasse armazenar grupos de dados com cada ID de amostra, você pode usar uma tabela relacionada. IE :)

Amostra


id int auto incremento
mysql> create table Sample (id int(11) not null auto_increment, primary key(id));

Detalhes


sample_id intrecord json
mysql> create table Details (sample_id int(11), record json);

Preencha seus dados
insert into Sample (id) values (1);
insert into Sample (id) values (2);

insert into Details (sample_id, record) values 
  (1, '{"id": 1, "name": "T1", "amount": "34.34", "percentage": "45"}'), 
  (1, '{"id": 3, "name": "T3", "amount": "30.34", "percentage": "45"}'), 
  (1, '{"id": 2, "name": "T2", "amount": "14.34", "percentage": "15"}');

insert into Details (sample_id, record) values 
  (2, '{"id": 1, "name": "T1", "amount": "34.34", "percentage": "45"}'),
  (2, '{"id": 2, "name": "T2", "amount": "30.34", "percentage": "45"}'),
  (2, '{"id": 4, "name": "T4", "amount": "14.34", "percentage": "15"}');

Então você pode fazer algo como
SELECT (
  JSON_OBJECT('id', id, 'amount', amount, 'percentage', percentage)
) FROM (
  SELECT 
    JSON_EXTRACT(record, "$.id") as id, 
    SUM(JSON_EXTRACT(record, "$.amount")) as amount, 
    AVG(JSON_EXTRACT(record, "$.percentage")) as percentage
  FROM Details 
  GROUP BY JSON_EXTRACT(record, "$.id")
) as t 

Resultados

+---------------------------------------------------------------------+
| (JSON_OBJECT('id', id, 'amount', amount, 'percentage', percentage)) |
+---------------------------------------------------------------------+
| {"id": 1, "amount": 68.68, "percentage": 45}                        |
| {"id": 2, "amount": 44.68, "percentage": 30}                        |
| {"id": 3, "amount": 30.34, "percentage": 45}                        |
| {"id": 4, "amount": 14.34, "percentage": 15}                        |
+---------------------------------------------------------------------+

Se você não quiser (ou não puder) usar um conjunto de dados normalizado, talvez você possa procurar escrever um procedimento armazenado que faça um loop sobre suas colunas de detalhes e agregue os dados para cada um, com uma consulta que agrega os dois conjuntos de dados.