sql >> データベース >  >> RDS >> Mysql

MySQLはJSONオブジェクトの合計を集計しました

    更新:わかりました

    まず、データを少し正規化することをお勧めします。オブジェクトだけを詳細列に保存しようとしましたか?各サンプルIDでデータのグループを保存する必要がある場合は、関連するテーブルを使用できます。 IE :)

    サンプル

    idint自動インクリメント

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

    正規化されたデータセットを使用したくない(または使用できない)場合は、詳細列をループして各列のデータを集約するストアドプロシージャを作成し、2つを集約するクエリを検討することもできます。データセット。



    1. PostgreSQLでのテキスト圧縮

    2. 選択したポイントから特定の距離にあるすべてのアドレスを見つけるための最良のアプローチは何ですか

    3. PostgreSQLおよびC#のデータ型

    4. macOSHighSierraにmysql-pythonをインストールします