Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL агрегирана сума от JSON обекти

Актуализация:Добре

Първо, определено бих препоръчал да нормализирате малко данните. Опитвали ли сте да съхранявате само обектите в колоната с подробности? Ако трябва да съхранявате групи данни с всеки примерен идентификатор, можете да използвате свързана таблица. IE :)

Извадка

id int автоматично увеличение

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

Подробности

sample_id intrecord json

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

Попълнете вашите данни

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

След това можете да направите нещо като

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 

Резултати

+---------------------------------------------------------------------+
| (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}                        |
+---------------------------------------------------------------------+

Ако не искате (или не можете) да използвате нормализиран набор от данни, тогава може би бихте могли да разгледате писане на съхранена процедура, която обикаля колоните с подробности и обобщава данните за всяка една, със заявка, която обобщава двете набори от данни.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql 1 произволен ред

  2. Най-добрият начин за справяне с правописни грешки в пълнотекстово търсене на MySQL

  3. търсене на данни от html вход в mysql

  4. MySQL DATE_ADD не работи

  5. MySQL Gem за Ruby On Rails