2016-04-13 33 views
0

1つの表には、1つのジョブでさまざまなemployee_idsがリストされています。oracle 11g listagg(参照IDは

従業員名は別の表に記載されています。アクション名は、追加の表にもあります。

従業員IDを集計するlistaggステートメントは簡単ですが、従業員名をリストする必要があります。

さらに、各ジョブ内のアクションIDをアクションの従業員に関連付ける必要があります。

select job.id, 
     listagg(hist.empl_id, ',') within group (order by job.id) as emp_list, 
     listagg(hist.ACTION_ID, ',') within group (order by job.id) as  actionid_list 
from jobs job, 
     job_action_log hist   
where job.id = hist.job_id 
     group by job.id; 

これは正しくjobid、集約されたempidと集約アクションIDを返しています。

job employee  action 
------------------------------- 
14 9, 12, 14, 9 5, 7, 88, 5 

必要とされるのは、アクションIDとアクションの名前を列挙し、別のテーブルから、従業員表からアクション名を従業員名を返すために、正しい行動との適切な従業員を関連付けることです。

所望の結果:

jobid employee name   action 
    ------------------------------------------------------ 
    14 Bob, Joe, Sam, Linda sweep, glass, mop, sweep 

任意の提案や支援が大幅に高く評価します。

答えて

2

ちょうどjoin他の2つのテーブルは、listaggで必要なフィールドを(適切に変更して)選択します。また、古いスタイルの結合の使用を中止する必要があります。

select 
job.id, 
listagg(e.employee_name, ',') within group (order by job.id) as emp_list, 
listagg(a.action_name, ',') within group (order by job.id) as actionid_list 
from jobs job 
join job_action_log hist on job.id = hist.job_id 
join actions a on a.id = hist.action_id 
join employees e on e.employee_id = hist.empl_id 
group by job.id; 
+0

滑らかです。ありがとうございます! – user761758