2017-08-30 1 views
1

Ich habe survey_results Tabelle, die folgenden Spalten:PostgreSQL - Gruppierung von jsonb Spalte

id - integer 
score_labels - jsonb 

score_labels Spalte Datenformat wie folgt aussieht:

{"total": "High", "risk": "High"}

Jetzt möchte ich SQL-Abfrage haben, gruppiert und zählt meine Umfrageergebnisse unter dieser score_labels Spalte. So sollte das Endergebnis aussehen:

total       risk 
-------      ------ 
{high: 2, medium: 1, low: 0} {high: 1, medium: 2, low: 1} 

Ich möchte die Umfrageergebnisse anhand der Punktzahlen zählen. Gibt es eine Möglichkeit, es in PostgreSQL zu tun? Hier

ist einfach sqlfiddle mit folgendem Schema:

http://sqlfiddle.com/#!17/0367f/1/0

Antwort

3

Eine etwas komplizierte Art der Aggregation:

with my_table (id, score_labels) as (
values 
(1, '{"total": "High", "risk": "High"}'::jsonb), 
(2, '{"total": "High", "risk": "Low"}'::jsonb), 
(3, '{"total": "Low", "risk": "Medium"}'::jsonb) 
) 

select 
    jsonb_build_object(
     'high', count(*) filter (where total = 'High'), 
     'medium', count(*) filter (where total = 'Medium'), 
     'low', count(*) filter (where total = 'Low') 
    ) as total, 
    jsonb_build_object(
     'high', count(*) filter (where risk = 'High'), 
     'medium', count(*) filter (where risk = 'Medium'), 
     'low', count(*) filter (where risk = 'Low') 
    ) as risk 
from (
    select 
     score_labels->>'total' as total, 
     score_labels->>'risk' as risk 
    from my_table 
    ) s 

       total    |    risk     
------------------------------------+------------------------------------ 
{"low": 1, "high": 2, "medium": 0} | {"low": 1, "high": 1, "medium": 1} 
(1 row) 
Verwandte Themen