1

我刚开始使用支持 JSON1 的 SQLite 3。

我已经创建了一个包含多个属性的数据库。这些属性之一是 json 对象。

我想要做的是在这个对象中执行聚合。

运行以下查询:

select json_extract(report, '$.some_attribute')
from table1
group by var1
having date == max(date);

返回以下内容:

[{"count":55,"label":"A"},{"count":99,"label":"B"}, {"count":1,"label":"C"}]
[{"count":29,"label":"A"},{"count":285,"label":"B"},{"count":461,"label":"C"}]
[{"count":6642,"label":"A"},{"count":24859,"label":"B"},{"count":3031,"label":"C"}]
[{"count":489,"label":"A"},{"count":250,"label":"B"},{"count":74,"label":"C"}]

现在,我想做的是按标签键分组,例如,对计数键求和

输出应该是这样的:

[{"label": A, 'count': 7215},
 {"label": B, 'count': 25493},
 {"label": C, 'count': 3567}]

或这个:

  A,       B,     C
7215,    25493,  3567

我试图像这样实现后一个:

select sum(A) as A, sum(B) as B, sum(C) as C
from (
select json_extract(report,
                '$.some_attribute[0].count') as A,
       json_extract(report,
                '$.some_attribute[1].count') as B,
       json_extract(report,
                '$.some_attribute[0].count') as C
from table1
group by var1
having date == max(date));

问题是,如何确保数组中的所有对象都以相同的方式排序。所以这可能会导致问题。

有什么解决办法吗?谢谢!

4

1 回答 1

2

如果你“取消嵌套”从第一个返回的 json 字符串json_extract,就像json_each 一样,它变得微不足道。这在我的复制中有效:

WITH result as (select jsonString from jsonPlay)
select json_extract(value,'$.label') label,SUM(json_extract(value,'$.count'))
from result,json_each(jsonString) 
group by label

给出这个结果:

一个| 7215
 乙| 25493
 C| 3567

基本上,你的select json_extract(report, '$.some_attribute')块替换select jsonString from jsonPlay

您可以使用它来“列”它,就像在您的 OR 选项中一样。

WITH result as (select jsonString from jsonPlay) 
select SUM(CASE WHEN json_extract(value,'$.label')='A' then json_extract(value,'$.count') END) 'A', 
SUM(CASE WHEN json_extract(value,'$.label')='B' then json_extract(value,'$.count') END) 'B', 
SUM(CASE WHEN json_extract(value,'$.label')='C' then json_extract(value,'$.count') END) 'C'
from result,json_each(jsonString)
于 2018-09-18T15:19:23.357 回答