У меня есть строки, содержащие Json, например: [{"Qty": 1, "Amt": 2.99},{"Qty": 3, Amt": 4.50}]
Как получить сумму Amt за строку?
Код воспроизведения:
DROP TABLE IF EXISTS dbo.SqlQueryResults;
CREATE TABLE dbo.SqlQueryResults(
Id INT,
Result nvarchar(max)
)
GO
INSERT INTO dbo.SqlQueryResults (Id, Result)
VALUES
(1, '[{"Qty":1, "Amt":2.99}, {"Qty":3, "Amt":4.50}]'),
(2, '[{"Qty":2, "Amt":7.99}, {"Qty":5, "Amt":2.50}]')
SELECT * FROM dbo.SqlQueryResults;
Я застрял в выражении пути Json. В документации Выражения пути JSON (SQL Server) показаны только массивы с именем "people": [{}.{}]
, например
Это запрос, который у меня есть на данный момент:
SELECT Id, SUM(CAST( JSON_VALUE(Result,N'lax $.[].Amt') as decimal))
FROM SqlQueryResults
GROUP BY Id
вот один из способов:
SELECT
id,
sum(cast(JSON_VALUE(value, '$.Amt') as numeric(10,2))) as sum_Amt
FROM dbo.SqlQueryResults
CROSS APPLY OPENJSON(Result)
GROUP BY id
выход :
Перекрестное применение OPENJSON, потрясающе! Попробую, когда вернусь за компьютер
Возможно, вы захотите изучить пункт WITH
в OPENJSON
.
Вы можете попробовать OPENJSON
вместе с WITH
. Это возвращает приведенные и именованные столбцы вложенного JSON.
SELECT qr.Id
,TheJson.*
FROM dbo.SqlQueryResults qr
CROSS APPLY OPENJSON(qr.Result)
WITH(
Qty INT,
Amt DECIMAL(10,4)
) TheJson;
Чтобы решить вашу проблему:
SELECT qr.Id
,SUM(TheJson.Amt) SumAmt
FROM dbo.SqlQueryResults qr
CROSS APPLY OPENJSON(qr.Result)
WITH(Amt DECIMAL(10,4)) TheJson
GROUP BY ID;
Мне это нравится, спасибо!
Я проголосовал за вашу попытку предоставить сценарий копирования и вставки.