我创建了新表并将详细信息作为 JSON 数据类型。我试图获得所有记录的总和。我可以获得每个值,但我不知道如何使用 group by 选项来获得总和。
CREATE TABLE `Sample` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`details` json DEFAULT NULL,
PRIMARY KEY (`id`)
) CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)
样本数据
1. [{"id": 1, "name": "T1", "amount": "34.34", "percentage": "45"}, {"id": 3, "name": "T3", "amount": "30.34", "percentage": "45"}, {"id": 2, "name": "T2", "amount": "14.34", "percentage": "15"}]
2. [{"id": 1, "name": "T1", "amount": "34.34", "percentage": "45"}, {"id": 2, "name": "T2", "amount": "30.34", "percentage": "45"}, {"id": 4, "name": "T4", "amount": "14.34", "percentage": "15"}]
Run Code Online (Sandbox Code Playgroud)
我想要这 2 条记录的聚合组
输出数据
[{"id": 1, "name": "T1", "amount": "68.68", "percentage": "45"}, {"id": 3, "name"`enter code here`: "T3", "amount": "30.34", "percentage": "45"}, {"id": 2, "name": "T2", "amount": "44.68", "percentage": "60"}, {"id": 4, "name": "T4", "amount": "14.34", "percentage": "15"}]
Run Code Online (Sandbox Code Playgroud)
我尝试使用 JSON_EXTRACT(details, "$[*]") 但没有成功
更新:好的
首先,我肯定会建议对数据进行一些规范化。您是否尝试将对象仅存储到详细信息列中?如果您需要使用每个样本 ID 存储数据组,您可以使用相关表。IE:)
id int 自动递增
mysql> create table Sample (id int(11) not null auto_increment, primary key(id));
Run Code Online (Sandbox Code Playgroud)
sample_id int 记录 json
mysql> create table Details (sample_id int(11), record json);
Run Code Online (Sandbox Code Playgroud)
填充您的数据
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"}');
Run Code Online (Sandbox Code Playgroud)
然后你可以做类似的事情
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
Run Code Online (Sandbox Code Playgroud)
+---------------------------------------------------------------------+
| (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} |
+---------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
如果您不想(或不能)使用规范化数据集,那么您可能会考虑编写一个存储过程,该过程循环遍历您的详细信息列并聚合每个列的数据,并使用聚合这两个列的查询数据集。
| 归档时间: |
|
| 查看次数: |
6570 次 |
| 最近记录: |