2016-01-17 11 views
2

以下是我擁有的兩個表格:[兩個表格中的所有列都是「text」類型],表格名稱和列名稱以粗體字體顯示。JOIN,彙總並在兩個表格之間的postgres中進行轉換

名稱

-------------------------------- 
Name  | DoB |  Team | 
-------------------------------- 
Harry | 3/12/85 | England 
Kevin | 8/07/86 | England 
James | 5/05/89 | England 

比分

------------------------ 
ScoreName | Score 
------------------------ 
James-1 | 120  
Harry-1 | 30  
Harry-2 | 40  
James-2 | 56  

最終結果我需要的是具有以下

NameScores表

--------------------------------------------- 
Name  | DoB |  Team | ScoreData 
--------------------------------------------- 
Harry | 3/12/85 | England | "{"ScoreName":"Harry-1", "Score":"30"}, {"ScoreName":"Harry-2", "Score":"40"}" 
Kevin | 8/07/86 | England | null 
James | 5/05/89 | England | "{"ScoreName":"James-1", "Score":"120"}, {"ScoreName":"James-2", "Score":"56"}" 

我需要使用一個SQL命令執行此操作,我將使用該命令創建物化視圖。

我已經意識到它會涉及到string_agg,JOIN和JSON的組合,但還沒有完全破解它。請幫助:)

回答

3

我不認爲join是棘手。併發症正在建設的JSON對象:

select n.name, n.dob, n.team, 
     json_agg(json_build_object('ScoreName', s.name, 
            'Score', s.score)) as ScoreData 
from names n left join 
    scores s 
    ons.name like concat(s.name, '-', '%') 
group by n.name, n.dob, n.team; 

注:json_build_object()在Postgres的9.4推出。

編輯:

我想你可以添加一個case聲明,以獲得簡單NULL:與row_to_json()

 (case when s.name is null then NULL 
      else json_agg(json_build_object('ScoreName', s.name, 
              'Score', s.score)) 
     end) as ScoreData 
+0

雖然這不會爲Kevin產生一個簡單的「null」,但它仍然很簡單,並且還是很簡單的:[{「ScoreName」:null,「Score」:null}]噸。謝謝 :) –

1

使用json_agg()以總比分數據成JSON值:

select n.*, json_agg(row_to_json(s)) "ScoreData" 
from "Names" n 
left join "Scores" s 
on n."Name" = regexp_replace(s."ScoreName", '(.*)-.*', '\1') 
group by 1, 2, 3; 

Name | DoB | Team |         ScoreData         
-------+---------+---------+--------------------------------------------------------------------------- 
Harry | 3/12/85 | England | [{"ScoreName":"Harry-1","Score":30}, {"ScoreName":"Harry-2","Score":40}] 
James | 5/05/89 | England | [{"ScoreName":"James-1","Score":120}, {"ScoreName":"James-2","Score":56}] 
Kevin | 8/07/86 | England | [null] 
(3 rows) 
相關問題