SQL tricks
September 1, 2022
How to aggregate data in JSON format?
id name 1 Client One 2 Client Two 3 Client Three
id client_id phone_type number 1 1 home +1 (012) 34567 2 1 work +1 (012) 53219 3 2 home +1 (012) 26974
Question: What can be used to receive JSON aggregated data from two tables?
The way to achieve desired result in PostgreSQL - using ROW_TO_JSON for generate JSON object from whole row data and JSON_AGG for aggregate rows to JSON array
SELECT ROW_TO_JSON(client.*)
FROM (
SELECT
clients.name,
JSON_AGG(
ROW_TO_JSON(client_phonenumbers.*)
) phonenumbers
FROM
clients
LEFT JOIN client_phonenumbers ON client_phonenumbers.client_id = clients.id
GROUP BY clients.id, clients.name
) client
ORDER BY client.name;PostgreSQL fiddle: https://sqlize.online/sql/psql12/bd6a22b130681214bd48f817b4ad6588/
In MySQL we can use JSON_OBJECT for generate JSON object from named fields data and JSON_ARRAYAGG for aggregate rows to JSON array
SELECT JSON_OBJECT(
'name', client.name,
'phonenumbers', client.phonenumbers
) json_data
FROM (
SELECT
clients.name,
JSON_ARRAYAGG(
JSON_OBJECT(
'phone_type', client_phonenumbers.phone_type,
'number', client_phonenumbers.number
)
) phonenumbers
FROM
clients
LEFT JOIN client_phonenumbers ON client_phonenumbers.client_id = clients.id
GROUP BY clients.id, clients.name
) client
ORDER BY client.name;MySQL fiddle: https://sqlize.online/sql/mysql57/9dc33f3fb12ca567324859c7cf8def1e/
Modern SQL Server versions provide "magic" FOR JSON AUTO that generate JSON output without any data manipulation
SELECT * FROM clients LEFT JOIN client_phonenumbers ON client_phonenumbers.client_id = clients.id FOR JSON AUTO;
MS SQL fiddle: https://sqlize.online/sql/mssql2017/c368008f0849aae2973fddbb8071d147/