2017-07-05 143 views
0

我有一個2表Existing_tools和Recommendation_tool有4列(帳戶,活動,Tools_name,計數),但最後一列給我現有工具的數量和推薦工具的數量在各自的表計數。sql查詢/ oracle

我想要輸出(帳戶,活動,Tools_name,existing_tools_count,recommendation_tools_count),按帳戶和活動分組,並且兩個表中存在的所有工具都會輸出。

如果工具的名字沒有出現在現有的表再算上會反對0 existing_tools_count,同樣的方式,如果工具不存在對抗recommendation_tools_count計數推薦表計數爲0。

如果工具是存在於那麼桌子上的數字就會相應地出現。

Existing_TOOLS

Account Activity  tools_Name Number of Existing_tool 
x Agile/Proj. Mgmt JIRA    5 
x Agile/Proj. Mgmt Collabnet  4 
x Build    ANT    3 
x Build    MAVEN   3 
y Agile/Proj. Mgmt JIRA    5 
y Agile/Proj. Mgmt Collabnet  4 
y Build    ANT    3 
y Build    MAVEN   3 

Recommendation_tool

Account Activity tools_Name Number of recommendation_tool 
x Agile/Proj. Mgmt JIRA   5 
x Agile/Proj. Mgmt HP ALM  4 
x Build    MS build  3 
y Agile/Proj. Mgmt JIRA   5 
y Agile/Proj. Mgmt HP ALM  4 
y Build    MS build  3 

Required_TABLE

Account Activity tools_Name Number of Existing_tool Number of recommendation_tool 
x Agile/Proj. Mgmt JIRA    5       5 
x Agile/Proj. Mgmt Collabnet   4       0 
x Agile/Proj. Mgmt HP ALM    0       4 
x Build    ANT     3       0 
x Build    MAVEN    3       0 
x Build    MS build   0       3 
y Agile/Proj. Mgmt JIRA    5       5 
y Agile/Proj. Mgmt Collabnet   4       0 
y Agile/Proj. Mgmt HP ALM    0       4 
y Build    ANT     3       0 
y Build    MAVEN    3       0 
y Build    MS build   0       3 
+0

所以,你要一個完整的外部聯接? – xQbert

回答

1

似乎是一個完全外部聯接和幾個聚結會工作。

  • Coalesce()返回系列中的第一個非空值。所以在示例coalesce(ET.Account, RT.Account) ET.Account值將返回,如果不爲空;否則RT.Account即使返回null也會返回;從而以某種方式獲得帳戶值或NULL(但僅當帳戶未在兩個表中填充時)。
  • FULL OUTER JOIN將根據鍵將兩個數據集連接在一起,並返回源匹配中的所有記錄在'開'時它的值。從而在適當的情況下合併兩組數據記錄

這並假設帳戶,活動和工具的名稱表示唯一的記錄,在每個表(並沒有值爲null)

SELECT coalesce(ET.Account, RT.Account) as Account 
    , coalesce(ET.Activity, RT.Activity) as Activity 
    , coalesce(ET.Tools_name, RT.Tools_name) as Tools_name 
    , coalesce(RT.Count,0) as Rec_tool_Count 
    , coalesce(ET.Count,0) as Existing_tool_count 
FROM Existing_tools ET 
FULL OUTER JOIN Recomendation_Tool RT 
    on ET.Account = RT.Account 
and ET.Activity = RT.Activity 
and ET.Tools_name = RT.Tools_Name 
ORDER BY coalesce(ET.Account, RT.Account), coalesce(ET.Activity, RT.Activity) 

不知道你的意思是由組帳戶活動...可能是爲了?分組使用聚合,這裏沒有...

或者你可能想要總結的計數在這種情況下,一組再次有意義,因爲也許你有一個或兩個表中的多個記錄帳戶工具和活動。

SELECT coalesce(ET.Account, RT.Account) as Account 
    , coalesce(ET.Activity, RT.Activity) as Activity 
    , coalesce(ET.Tools_name, RT.Tools_name) as Tools_name 
    , sum(coalesce(RT.Count,0)) as SUM_Rec_tool_Count 
    , sum(coalesce(ET.Count,0)) as SUM_Existing_tool_count 
FROM Existing_tools ET 
FULL OUTER JOIN Recomendation_Tool RT 
    on ET.Account = RT.Account 
and ET.Activity = RT.Activity 
and ET.Tools_name = RT.Tools_Name 
GROUP BY coalesce(ET.Account, RT.Account) as Account 
     , coalesce(ET.Activity, RT.Activity) as Activity 
     , coalesce(ET.Tools_name, RT.Tools_name) as Tools_name 
ORDER BY coalesce(ET.Account, RT.Account), coalesce(ET.Activity, RT.Activity) 
+0

thanx xQbert爲你的時間..你的第二個查詢是有道理的... ...很多thanx – user6498752

+0

然後接受它。 –

0

我想可能是 「乾淨」 做union allgroup by

select account, activity, tools_name, 
     sum(et_count) as et_count, sum(rt_count) as rt_count 
from ((select et.account, et.activity, et.tools_name, 
      et.count as et_count, 0 as rt_count 
     from Existing_tools 
    ) union all 
     (select rt.account, rt.activity, rt.tools_name, 0, rt.count 
     from Recommendation_Tool 
    ) 
    ) er 
group by account, activity, tools_name 
order by Account, Activity, Tools_Name; 

所有coalesce()所需full outer join小號得到煩人。

當然,你也可以使用USING消除大部分:

選擇帳戶,活動,Tools_Name, COALESCE(RT.Count,0)作爲Rec_tool_Count, COALESCE(ET。計數,0)作爲Existing_tool_count FROM Existing_tools ET FULL OUTER JOIN Recomendation_Tool RT 使用(帳號,活動,Tools_Name) ORDER BY帳戶,活動,Tools_Name