2017-08-30 12 views
1

私は列に、次のいsurvey_resultsのテーブルを持っている:PostgreSQLは - jsonb列によってグループ化

id - integer 
score_labels - jsonb 

score_labels列のデータ形式は次のようになります。

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

は、今私は、SQLクエリを持ちたいというこのscore_labels列で調査結果をグループ化してカウントします。最終結果は次のようになります。

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

アンケート結果をスコアラベルでカウントします。 PostgreSQLでそれを行う方法はありますか?

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

答えて

3

凝集の多少複雑種類::

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) 
ここ

は、次のスキーマを持つ単純なsqlfiddleです

関連する問題