Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zagregowana suma obiektów JSON w MySQL

Aktualizacja:dobrze

Po pierwsze, zdecydowanie polecam nieco normalizację danych. Czy próbowałeś przechowywać tylko obiekty w kolumnie szczegółów? Jeśli potrzebujesz przechowywać grupy danych z każdym identyfikatorem próbki, możesz użyć powiązanej tabeli. IE:)

Próbka

id int auto inkrement

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

Szczegóły

sample_id intrecord json

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

Wypełnij swoje dane

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

Wtedy możesz zrobić coś takiego

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 

Wyniki

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

Jeśli nie chcesz (lub nie możesz) używać znormalizowanego zbioru danych, być może przyjrzysz się pisaniu procedury składowanej, która zapętla kolumny szczegółów i agreguje dane dla każdej z nich za pomocą zapytania, które agreguje te dwie zestawy danych.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd podczas konfigurowania Laravela na Mac php artisan migracji:brak takiego pliku lub katalogu

  2. Jak połączyć się z puli instancji Google Compute Engine z Cloud SQL DB w tym samym projekcie?

  3. Podczas wykonywania polecenia wystąpił błąd krytyczny. w C#, gdy używam Wstaw do

  4. Mysql left join z warunkiem w prawej tabeli

  5. Błąd instalacji Ruby gem mysql2