My database looks like this:
Raw Table Data :
The Result returned :
from the query below :
SELECT ROW_NUMBER() OVER ( ORDER BY stokkodu ) AS RowNum,
stokkodu,
adi,
beden,
renk,
kalan,
afiyat
FROM (SELECT stokkodu, adi, afiyat, renk, SUM(kalan) AS kalan, beden
FROM [viabase].[dbo].[Q_KALANS]
GROUP BY stokkodu, adi, afiyat, renk, beden) AS products
Now I need to get the sizes of the products grouped under separate color nodes to fetch from the DB to present to the client site as in the JSON Format like this :
How can I do that? Is it possible?
CodePudding user response:
Unfortunately, SQL Server does not have the JSON_AGG
function, which would have made this easier. Instead we need to hack it with a combination of STRING_AGG
to aggregate, STRING_ESCAPE
to correctly escape the values, and JSON_QUERY
to prevent double-escaping.
You also need to get the base adi
value. I've tried to do that with REPLACE
and TRIM
but cannot test due to lack of proper sample data.
WITH L1 AS (
SELECT
adi = TRIM(REPLACE(REPLACE(qk.adi, qk.renk, ''), qk.beden, '')),
qk.renk,
qk.beden,
SUM(qk.kalan) AS kalan
FROM dbo.Q_KALANS qk
GROUP BY
qk.adi,
qk.renk,
qk.beden
),
L2 AS (
SELECT
qk.adi,
qk.renk,
json = '{' STRING_AGG(CONCAT('"', STRING_ESCAPE(qk.beden, 'json'), '":', SUM(kalan)), ',') '}'
FROM L1 qk
GROUP BY
qk.adi,
qk.renk
)
SELECT
qk.adi,
STOCK = JSON_QUERY('{' STRING_AGG(CONCAT('"', STRING_ESCAPE(qk.renk, 'json'), '":', qk.json), ',') '}')
FROM L2 qk
GROUP BY
qk.adi
FOR JSON PATH;