跨多行对 JSON 属性求和



>我有一个包含两列的表格:idvaluesvalues列是一个 json 数组,其中包含n个元素,每个元素都是一个 json 对象。json对象有两个属性ab,两者都是浮点数。我正在尝试编写一个查询,该查询汇总所有行中 json 数组values处的第一个索引处的a属性。然后它对属性b做同样的事情。此外,它应该对所有索引中的所有 json 对象执行此操作。这可能吗?我知道您可以在SQL Server中操作和查询json列(这就是我正在使用的),但是无法弄清楚实现此目的的方法。

下面是一个示例,说明了我想要实现的目标。假设我们有以下行:

values>[{"a": 1, "b": 2}, {"a": 2, "b": 4}]>[{"a": 5, "b": 10}, {"a": 6, "b": 12}]
id
1
2 ;">[{"a": 3, "b": 6}, {"a": 4, "b": 8}]
3
4 ;">[{"a": 7, "b": 14}, {"a": 8, "b": 16}]

您需要分解单独的ab值,然后重建 JSON。

如果你有固定数量的索引,那么你可以很容易地使用JSON_VALUE(values, '$[0].a')等,但由于数组中有任意数量的对象,你需要用OPENJSON将数组切成单独的行

SELECT
a = SUM(CAST(JSON_VALUE(j.[value], '$.a') AS int)),
b = SUM(CAST(JSON_VALUE(j.[value], '$.b') AS int))
FROM YourTable t
CROSS APPLY OPENJSON(t.[values]) j   -- with no path then [key] is the array index, [value] is the object
GROUP BY CAST(j.[key] AS int)
ORDER BY CAST(j.[key] AS int)
FOR JSON AUTO;

你应该阅读 JSON_VALUE(),因为它是这里所需要的。路径将为'$[0].a''$[0].b'

这是一个 SQL Fiddle 示例,可以实现您所追求的目标。

最新更新