组密钥Json,Sum和动态如何?

问题描述 投票:1回答:1

我的mariadb服务器上有一个json列。我遇到了一个问题:我无法组织json。

我已经尝试过使用程序和功能但是连续失败我希望能够把这个解决方案的方法包括给那些比我初学者更好的朋友

样本数据 :

id   name           json
------------------------------------------------------
1    lorem ipsum    {"a":2,"b": 10, "c": 20}
2    lorem ipsum2   {"a":1, "b":8, "c": 21, "d":7}
2    lorem ipsum2   {"b":1, "e":8, "h": 21, "j":7}

现在我想要这样的输出数据,如果数据增加json对象的A到Z,则动态计算值:

key  average  max_value  min_value  sum_value  count_data
---------------------------------------------------------
a    1.5      2          1          3          2
b    8.2      10         1          19         3
c    20.5     21         20         41         2
d    7        7          7          7          1
mysql sql json mariadb
1个回答
1
投票

您的示例数据仅显示4个键的结果,而数据中的结果不仅仅是4个键。如果您想要一组固定键的结果,这是一个解决方案;它使用子查询列出应该考虑的键,以及外部查询中的条件聚合; JSON_EXTRACT允许您访问对象的内容:

SELECT
    v.val,
    AVG(JSON_EXTRACT(js, CONCAT('$.', v.val))) AS average,
    MAX(JSON_EXTRACT(js, CONCAT('$.', v.val))) AS max_value,
    MIN(JSON_EXTRACT(js, CONCAT('$.', v.val))) AS min_value,
    SUM(JSON_EXTRACT(js, CONCAT('$.', v.val))) AS sum_value,
    COUNT(JSON_EXTRACT(js, CONCAT('$.', v.val))) AS count_data
FROM t
CROSS JOIN (
    SELECT 'a' val UNION ALL SELECT'b' UNION ALL SELECT'c' UNION ALL SELECT'd'
) v
GROUP BY v.val   

Demo on DB Fiddle

| val | average | max_value | min_value | sum_value | count_data |
| --- | ------- | --------- | --------- | --------- | ---------- |
| a   | 1.5     | 2         | 1         | 3         | 2          |
| b   | 6.3333  | 8         | 1         | 19        | 3          |
| c   | 20.5    | 21        | 20        | 41        | 2          |
| d   | 7       | 7         | 7         | 7         | 1          |

如果您的标记值范围从az,那么一个(丑陋但有效)解决方案是使用更多UNION ALL SELECTs扩展子查询。

© www.soinside.com 2019 - 2024. All rights reserved.