簡體   English   中英

連接表,並在單行的不同列中返回數據並顯示連接數

[英]Join Tables and Return data in single row different columns with count of join

在Oracle 11g中,我們有3個表,需要左連接它們,並以連接計數返回單行不同列中的數據,有什么辦法可以達到相同的目的。

例:

表1 :(員工數據)

在此處輸入圖片說明

表2 :(“雇員地址”)

在此處輸入圖片說明

表3:(Employee_Role)

在此處輸入圖片說明

預期結果:

在此處輸入圖片說明

Mack具有2個地址和2個角色,因此Emp_Addr_Count為2,Emp_Role_Count為2,並且相關數據在同一行的不同列中。

請注意,EMP_ID在Employee_Data表中是唯一的,並且Employee_Address和Employee_Role對於Employee可以是多個或零。

提前致謝。

嘗試這個:

SELECT E.Emp_Id
    ,E.Emp_Name
    ,E.Emp_Age
    ,NVL(MAX(EA.RN),0)Addr_Count
    ,NVL(MAX(CASE WHEN EA.RN = 1 THEN EA.Emp_Address END),' ')Emp_Address_1
    ,NVL(MAX(CASE WHEN EA.RN = 1 THEN EA.Emp_City END),' ')Emp_City_1
    ,NVL(MAX(CASE WHEN EA.RN = 2 THEN EA.Emp_Address END),' ')Emp_Address_2
    ,NVL(MAX(CASE WHEN EA.RN = 2 THEN EA.Emp_City END),' ')Emp_City_2
    ,NVL(MAX(ER.RN1),0)Role_Count
    ,NVL(MAX(CASE WHEN ER.RN1 = 1 THEN ER.Emp_task END),' ')Emp_task_1
    ,NVL(MAX(CASE WHEN ER.RN1 = 2 THEN ER.Emp_task END),' ')Emp_task_2 FROM Employee_Data E JOIN(
SELECT Emp_Id
    ,ROW_NUMBER() OVER(PARTITION BY Emp_Id ORDER BY Emp_City desc) RN
    ,Emp_City
    ,Emp_Address
FROM Employee_Address
)EA ON EA.Emp_Id = E.Emp_Id left JOIN(
SELECT Emp_Id
    ,ROW_NUMBER() OVER(PARTITION BY Emp_Id ORDER BY Emp_Task) RN1
    ,Emp_task
FROM Employee_Role
)ER ON ER.Emp_Id = E.Emp_Id GROUP BY E.Emp_Id,E.Emp_Name,E.Emp_Age

輸出:

EMP_ID  EMP_NAME    EMP_AGE ADDR_COUNT  EMP_ADDRESS_1   EMP_CITY_1  EMP_ADDRESS_2   EMP_CITY_2  ROLE_COUNT  EMP_TASK_1  EMP_TASK_2
1       MACK        45      2       HOME PARADISE       MUM         TINDER ONCLAVE  DEL         2           Manage Task Resource Manage
2       JACK        30      1       BLUE PLAZA          MUM                                     1           Code    
3       ANGEL       27      1       HOME PARADISE       MUM                                     0       

您可以按照以下語句加入他們:

WITH t AS
(
 SELECT d.*, a.emp_address, a.emp_city, r.emp_task  
   FROM employee_data d 
   JOIN employee_address a on ( d.emp_id = a.emp_id )
   FULL OUTER JOIN employee_role r on ( d.emp_id = r.emp_id )
)
SELECT emp_id, emp_name, emp_age, count(distinct emp_address) emp_addr_count, 
       min(emp_address) emp_address_1, max(emp_city) emp_city_1, 
       decode(min(emp_address),max(emp_address),null,max(emp_address)) emp_address_2, 
       decode(min(emp_city),max(emp_city),null,min(emp_city)) emp_city_2,
       count(distinct emp_task) emp_role_count, min(emp_task) emp_task_1, 
       decode(min(emp_task),max(emp_task),null,max(emp_task)) emp_task_2        
  FROM t
 GROUP BY emp_id, emp_name, emp_age     
 ORDER BY emp_id;

SQL小提琴演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM