使用 SQL 拉动浮点数以对数组结构中的数据求和
Pulling floats to sum data in array structure using SQL
我正在尝试从数组结构中提取数字,然后对它们求和。
示例行条目:
{"DBA":50.0},{"RST":132.0},{"ZIT":752}
我想对所有数值求和,所以 50 + 132 + 752 = 934
我试过的:col = 列名
SELECT SUBSTRING(col, LEN(LEFT(col, CHARINDEX (':', col))) + 1, LEN(col) - LEN(LEFT(col,
CHARINDEX (':', col))) - LEN(RIGHT(col, LEN(col) - CHARINDEX ('}', Benefit))) - 1)
FROM table
这可以在上面的示例中获取第一个值(即 50.0),但不会获取每个值。知道如何使此查询获取多个值然后将它们相加吗?
我个人会将您的数据转换为格式正确的实际数据 JSON。然后你可以很容易地 SUM
值:
DECLARE @YourString nvarchar(MAX) = N'{"DBA":50.0},{"RST":132.0},{"ZIT":752}';
SELECT SUM(TRY_CONVERT(decimal(5,1),[value]))
FROM (VALUES(CONCAT('{',REPLACE(REPLACE(@YourString,'{',''),'}',''),'}')))V(JSONString)
CROSS APPLY OPENJSON(V.JSONString);
或者您可以将 WITH
添加到 OPENJSON
调用,然后添加 (+
) 值:
DECLARE @YourString nvarchar(MAX) = N'{"DBA":50.0},{"RST":132.0},{"ZIT":752}';
SELECT OJ.DBA + OJ.RST + OJ.ZIT
FROM (VALUES(CONCAT('{',REPLACE(REPLACE(@YourString,'{',''),'}',''),'}')))V(JSONString)
CROSS APPLY OPENJSON(V.JSONString)
WITH (DBA decimal(5,1),
RST decimal(5,1),
ZIT decimal(5,1)) OJ;
内容几乎是有效的 JSON,因此您可以尝试修复它并使用 built-in JSON 支持使用 OPENJSON()
(有效的 JSON内容为[{"DBA":50.0},{"RST":132.0},{"ZIT":752}]
):
SELECT
t.[Column],
[Sum] = (
SELECT SUM(CONVERT(numeric(10, 1), j2.value))
FROM OPENJSON(CONCAT('[', t.[Column], ']')) j1
CROSS APPLY OPENJSON(j1.[value]) j2
)
FROM (VALUES
('{"DBA":50.0},{"RST":132.0},{"ZIT":752}')
) t ([Column])
我正在尝试从数组结构中提取数字,然后对它们求和。
示例行条目:
{"DBA":50.0},{"RST":132.0},{"ZIT":752}
我想对所有数值求和,所以 50 + 132 + 752 = 934
我试过的:col = 列名
SELECT SUBSTRING(col, LEN(LEFT(col, CHARINDEX (':', col))) + 1, LEN(col) - LEN(LEFT(col,
CHARINDEX (':', col))) - LEN(RIGHT(col, LEN(col) - CHARINDEX ('}', Benefit))) - 1)
FROM table
这可以在上面的示例中获取第一个值(即 50.0),但不会获取每个值。知道如何使此查询获取多个值然后将它们相加吗?
我个人会将您的数据转换为格式正确的实际数据 JSON。然后你可以很容易地 SUM
值:
DECLARE @YourString nvarchar(MAX) = N'{"DBA":50.0},{"RST":132.0},{"ZIT":752}';
SELECT SUM(TRY_CONVERT(decimal(5,1),[value]))
FROM (VALUES(CONCAT('{',REPLACE(REPLACE(@YourString,'{',''),'}',''),'}')))V(JSONString)
CROSS APPLY OPENJSON(V.JSONString);
或者您可以将 WITH
添加到 OPENJSON
调用,然后添加 (+
) 值:
DECLARE @YourString nvarchar(MAX) = N'{"DBA":50.0},{"RST":132.0},{"ZIT":752}';
SELECT OJ.DBA + OJ.RST + OJ.ZIT
FROM (VALUES(CONCAT('{',REPLACE(REPLACE(@YourString,'{',''),'}',''),'}')))V(JSONString)
CROSS APPLY OPENJSON(V.JSONString)
WITH (DBA decimal(5,1),
RST decimal(5,1),
ZIT decimal(5,1)) OJ;
内容几乎是有效的 JSON,因此您可以尝试修复它并使用 built-in JSON 支持使用 OPENJSON()
(有效的 JSON内容为[{"DBA":50.0},{"RST":132.0},{"ZIT":752}]
):
SELECT
t.[Column],
[Sum] = (
SELECT SUM(CONVERT(numeric(10, 1), j2.value))
FROM OPENJSON(CONCAT('[', t.[Column], ']')) j1
CROSS APPLY OPENJSON(j1.[value]) j2
)
FROM (VALUES
('{"DBA":50.0},{"RST":132.0},{"ZIT":752}')
) t ([Column])