首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sql查询/oracle

sql查询/oracle
EN

Stack Overflow用户
提问于 2017-07-06 01:08:33
回答 2查看 35关注 0票数 0

我有2个表Existing_tools和Recommendation_tool,有4列(Account,Activity,Tools_name,count),但最后一列给出了现有工具的数量和各自表中推荐工具的数量。

我想要输出(Account、Activity、Tools_name、existing_tools_count、recommendation_tools_count),按帐户和活动分组,两个表中出现的所有工具都在输出中。

如果现有表格中不存在刀具名称,则针对existing_tools_count的计数将为0,同样,如果工具不存在于推荐表中,则针对recommendation_tools_count计数的计数将为0。

如果工具在两个表中都存在,那么给定的计数将相应地出现。

Existing_TOOLS

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2017-07-06 01:15:58

看起来像是一个完整的外部连接和一些合并就可以工作。

  • Coalesce()返回序列中的第一个非空值。因此,在示例中,如果不为空,则coalesce(ET.Account, RT.Account) ET.Account值将返回;否则,即使为空,也将返回RT.Account;因此,我们以某种方式获得帐户值或NULL (但只有当帐户未填充到两个tables.)
  • FULL OUTER JOIN中时,才会根据键将两个数据集连接在一起,并在可能的情况下返回与' on‘中的值相匹配的任一源的所有记录。从而在适当的地方组合来自两个数据集的记录。

这确实假设帐户、活动和工具名称表示每个表中的唯一记录(并且这些值都不为空)

代码语言:javascript
复制
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)

不确定您所说的按帐户分组活动是什么意思...也许是order by?Group by与此处没有的聚合一起使用...

或者,您可能希望对计数求和,在这种情况下,group by再次有意义,因为您可能在一个帐户工具和活动的一个或两个表中有多个记录。

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2017-07-06 02:25:33

我认为做一个union allgroup by可能会更“干净”。

代码语言:javascript
复制
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;

full outer join所需的所有coalesce()都变得令人厌烦。

当然,您也可以使用USING消除其中的大多数问题

选择帐户,活动,Tools_Name,合并(RT.Count,0)作为Rec_tool_Count,合并(ET.Count,0)作为Existing_tool_count FROM Existing_tools ET FULL OUTER JOIN Recomendation_Tool RT USING (Account,Activity,Tools_Name) ORDER BY Account,Activity,Tools_Name

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44932206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档