Je behandelt het resultaat van de eerste join als JSON, niet als tekststring, dus gebruik jsonb_each()
in plaats van jsonb_each_text()
:
SELECT t.employee, json_object_agg(a.k, d.value) AS sales
FROM mytable t
JOIN LATERAL jsonb_each(t.data) a(k,v) ON a.k LIKE 'sales_%'
JOIN LATERAL jsonb_to_recordset(a.v) d(yr text, value float) ON d.yr = '2012'
WHERE t.employee = 'Jim' -- works because employee is unique
GROUP BY 1;
GROUP BY 1
is een afkorting voor GROUP BY t.employee
.
Resultaat:
employee | sales
---------+--------
Jim | '{ "sales_tv" : 40, "sales_radio" : 76 }'
Ik heb je vraag ook ontward en vereenvoudigd.
json_object_agg()
speelt een belangrijke rol bij het aggregeren van naam/waarde-paren als JSON-object. Optioneel casten naar jsonb
als je dat nodig hebt - of gebruik jsonb_object_agg()
in Postgres 9.5 of hoger.
Expliciete JOIN
gebruiken syntaxis om voorwaarden op hun meest voor de hand liggende plaats toe te voegen.
Hetzelfde zonder expliciete JOIN
syntaxis:
SELECT t.employee, json_object_agg(a.k, d.value) AS sales
FROM mytable t
, jsonb_each(t.data) a(k,v)
, jsonb_to_recordset(a.v) d(yr text, value float)
WHERE t.employee = 'Jim'
AND a.k LIKE 'sales_%'
AND d.yr = '2012'
GROUP BY 1;