我有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
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 3Recommendation_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 3Required_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发布于 2017-07-06 01:15:58
看起来像是一个完整的外部连接和一些合并就可以工作。
Coalesce()返回序列中的第一个非空值。因此,在示例中,如果不为空,则coalesce(ET.Account, RT.Account) ET.Account值将返回;否则,即使为空,也将返回RT.Account;因此,我们以某种方式获得帐户值或NULL (但只有当帐户未填充到两个tables.)FULL OUTER JOIN中时,才会根据键将两个数据集连接在一起,并在可能的情况下返回与' on‘中的值相匹配的任一源的所有记录。从而在适当的地方组合来自两个数据集的记录。这确实假设帐户、活动和工具名称表示每个表中的唯一记录(并且这些值都不为空)
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再次有意义,因为您可能在一个帐户工具和活动的一个或两个表中有多个记录。
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)发布于 2017-07-06 02:25:33
我认为做一个union all和group 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;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
https://stackoverflow.com/questions/44932206
复制相似问题