sql >> Base de Datos >  >> RDS >> Mysql

MySQL suma agregada de objetos JSON

Actualización:Está bien

Primero, definitivamente recomendaría normalizar un poco los datos. ¿Ha intentado almacenar solo los objetos en la columna de detalles? Si necesita almacenar grupos de datos con cada ID de muestra, puede usar una tabla relacionada. ES:)

Muestra

id int incremento automático

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

Detalles

sample_id intrecord json

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

Complete sus datos

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"}');

Entonces puedes hacer 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}                        |
+---------------------------------------------------------------------+

Si no quiere (o no puede) usar un conjunto de datos normalizado, entonces tal vez podría considerar escribir un procedimiento almacenado que recorre sus columnas de detalles y agrega los datos para cada uno, con una consulta que agrega los dos conjuntos de datos.