合并SQL server中包含不同行数的两个表

合并SQL server中包含不同行数的两个表,sql,sql-server,join,union,multiple-tables,Sql,Sql Server,Join,Union,Multiple Tables,我有两个表,我想连接它们来创建最后一个表 问题1 select DisplayName, Category, NoOfLevels , count(Underoverestimate) as OverCount , Avg(CaseDuration - EstDuration) as ODA from DSU where yearid between '2016' and '2018' and underoverestimate = 'Over' group by DisplayName, Ca

我有两个表,我想连接它们来创建最后一个表

问题1

select DisplayName, Category, NoOfLevels
, count(Underoverestimate) as OverCount
, Avg(CaseDuration - EstDuration) as ODA
from DSU
where yearid between '2016' and '2018'
and underoverestimate = 'Over'
group by DisplayName, Category, nooflevels
问题2

select DisplayName, Category, NoOfLevels
, count(Underoverestimate) as UnderCount
, Avg(CaseDuration - EstDuration) as ODA
from DSU
where yearid between '2016' and '2018'
and underoverestimate = 'Under'
group by DisplayName, Category, nooflevels
查询1结果

DisplayName|Category     |NoOfLevels|OverCount|ODA
Bran, J.   |Fusion       |Single    |2        |102.5
Bran, J.   |Decompression|          |1        |13
Caron, M.  |Fusion       |Multi     |9        |88.444
查询2结果

DisplayName|Category     |NoOfLevels|UnderCount|ODA
Curry, S.  |Fusion       |Multi     |2        |105
Bran, J.   |Fusion       |Single    |1        |115.5
Bran, J.   |Decompression|          |4        |131
Caron, M.  |Decompression|          |5        |66
我希望最终结果是保留所有唯一的DisplayName、Catergory和NoOfLevels,但在查询1中添加“OverCount”和ODA,在查询2中添加“UnderCount”和“ODA”

想要的最终结果

DisplayName|Category     |NoOfLevels|OverCount|ODA    |UnderCount|ODA
Bran, J.   |Fusion       |Single    |2        |102.5  |1         |115.5
Bran, J.   |Decompression|          |1        |13     |4         |131
Caron, M.  |Decompression|          |         |       |5         |66
Caron, M.  |Fusion       |Multi     |9        |88.444 |          |
Curry, S.  |Fusion       |Multi     |         |       |5         |66
我试图通过使用查询1和查询2生成临时表,然后生成一个新的select语句来报告所需的数据来实现这一点

Select #QueryOne.DisplayName, #QueryOne.Category, 
#QueryOne.NoOfLevels, count(#QueryTwo.UnderCount) as UnderCount
from #QueryOne
join #QueryTwo
on #QueryOne.DisplayName = #QueryTwo.DisplayName
group by #QueryOne.DisplayName, #QueryOne.Category, 
#QueryOne.NoOfLevels
order by #QueryOne.DisplayName, #QueryOne.Category, 
#QueryOne.NoOfLevels
我的结果是错误的。我仍然在测试查询,所以我还没有包括我想要的所有列,但是在测试中我注意到结果是错误的

DisplayName|Category     |NoOfLevels|UnderCount|
Bran, J.   |Fusion       |Single    |6         |
Caron, M.  |Fusion       |Multi     |9         |
Bran, J.   |Decompression|          |6         |
Curry, S.  |Fusion       |Multi     |12        |
Caron, M.  |Decompression|          |9         |
前3列看起来正确,但“UnderCount”值不正确。此查询中的“COUNT”函数为我提供Bran行的总数。使用“总和”也会导致错误的信息。最后,如果我删除了“COUNT”,那么我需要将QueryTwo.UnderCount放入组中,通过该组可以得到以下结果:

DisplayName|Category     |NoOfLevels|UnderCount|
Bran, J.   |Fusion       |Single    |1         |
Bran, J.   |Fusion       |Single    |2         |
Bran, J.   |Decompression|          |1         |
Bran, J.   |Decompression|          |2         |
Caron, M.  |Decompression|          |3         |
Caron, M.  |Decompression|          |2         |
Caron, M.  |Fusion       |Multi     |3         |
Caron, M.  |Fusion       |Multi     |1         |
我试着通过stackoverflow寻找这个答案,但没有发现类似的问题,我发现了很多关于加入两个表的问题,但它们的问题不一样。。。我曾考虑过联合,但如果下一步是正确的,我似乎无法振作起来。我认为部分问题在于查询1的显示名不在查询2中,反之亦然。让你很难加入

如果我需要进一步澄清,请让我知道,我的脑子乱七八糟

尝试使用完全联接从两个表中获取所有唯一的DisplayName、Category、NoOfLevels行

select *
from (query1) t1 
full join (query2) t2 
    on t1.DisplayName = t2.DisplayName
    and t1.Category = t2.Category
    and t1.NoOfLevels = t2.NoOfLevels
另一种可能的解决方案是使用无连接的条件聚合

select DisplayName, Category, NoOfLevels
, count(case when underoverestimate = 'Over' then Underoverestimate end) as OverCount
, count(case when underoverestimate = 'Under' then Underoverestimate end) as UnderCount
, Avg(case when underoverestimate = 'Over' then CaseDuration - EstDuration end) as ODA
, Avg(case when underoverestimate = 'Under' then CaseDuration - EstDuration end) as UDA
from DSU
where yearid between '2016' and '2018'
and underoverestimate IN ( 'Over' , 'Under' )
group by DisplayName, Category, nooflevels

您可以使用完全联接从两个表中获取结果。欲了解更多信息,请访问


我更喜欢第二种解决方案:第一个查询提供了我想要的所有必要信息,但是,由于t1中有一些显示名,t2中有一些显示名,因此选择特定列变得很困难,因此使用t1.DisplayNames并不能表示所有的组合。但是,您提出的第二个查询非常有效!我将把这个思考过程添加到我以前的工作中!非常感谢。
SELECT
  *
FROM (SELECT
  DisplayName,
  Category,
  NoOfLevels,
  COUNT(Underoverestimate) AS OverCount,
  AVG(CaseDuration - EstDuration) AS ODA
FROM DSU
WHERE yearid BETWEEN '2016' AND '2018'
AND underoverestimate = 'Over'
GROUP BY DisplayName,
         Category,
         nooflevels) a
FULL OUTER  JOIN (SELECT
  DisplayName,
  Category,
  NoOfLevels,
  COUNT(Underoverestimate) AS UnderCount,
  AVG(CaseDuration - EstDuration) AS ODA
FROM DSU
WHERE yearid BETWEEN '2016' AND '2018'
AND underoverestimate = 'Under'
GROUP BY DisplayName,
         Category,
         nooflevels) b
  ON a.DisplayName = b.DisplayName
  AND a.Category = b.Category
  AND a.NoOfLevels = b.NoOfLevels