SQL Server : query columns to JSON object with group by
Try this:
SELECT (SELECT [ID], [Keys], [ValueV] FOR JSON PATH)
FROM #Test
GROUP BY ID, keys, ValueV
or this:
SELECT (SELECT [ID], [Keys], [ValueV] FOR JSON PATH, WITHOUT_ARRAY_WRAPPER)
FROM #Test
GROUP BY ID, keys, ValueV
This works (in SQL Server 2017, where STRING_AGG
is available), but is quite clumsy. I'm not sure there's not a more elegant way.
SELECT (
SELECT
ID,
ValueV,
Keys = JSON_QUERY('["' + STRING_AGG(STRING_ESCAPE(Keys, 'json'), '","') + '"]')
FOR JSON PATH
)
FROM #Test
GROUP BY ID, ValueV
For SQL Server 2016 (which has no STRING_AGG
, or STRING_ESCAPE
for that matter):
SELECT (
SELECT ID, ValueV, Keys = JSON_QUERY(REPLACE(REPLACE(
(
SELECT Keys
FROM #Test t2 WHERE t2.ID = t1.ID AND t2.ValueV = t1.ValueV
FOR JSON PATH
),
'{"Keys":', ''),
'}', ''))
FOR JSON PATH
)
FROM #Test t1
GROUP BY ID, ValueV
Even less elegant, but you take what you can get. At least we're not concatenating with FOR XML
...
Posting this if any one has the same sort of use case
SELECT [t].[ID],
(SELECT [t1].[KEYS], [t1].[ValueV] FROM @Test t1 WHERE t1.[ID] = [t].id FOR JSON PATH ) a
FROM @Test AS [t]
GROUP BY [t].[ID]