合并 SQL 服务器中行数不同的两个表
Combine two tables which different number of rows in SQL server
我有两个 table 想加入以创建一个决赛 table。
查询 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、Category 和 NoOfLevels,但添加来自查询 1 的 'OverCount' 和 ODA 以及来自查询的 'UnderCount' 和 'ODA' 2.
想要的最终结果
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 制作 temp tables 然后制作一个新的 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 的总行数。使用 'SUM' 也会导致错误信息。最后,如果我删除 '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 |
我试过通过 Whosebug 寻找这个答案,但没有发现类似的问题,我发现了很多关于加入两个 table 的问题,但他们的问题并不相同.. . 我已经考虑过 UNION 但如果那是正确的下一步,我似乎无法理解。我认为部分问题是查询 1 具有不在查询 2 中的显示名称,反之亦然。让加入变得困难??
如果我需要澄清更多,请让我知道,我的大脑是糊状的。
尝试使用 full join
从两个表中获取所有唯一的 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
您可以使用完全联接从两个 table 中获取结果。欲了解更多信息,请访问 https://www.w3schools.com/sql/sql_join_full.asp
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
我有两个 table 想加入以创建一个决赛 table。
查询 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、Category 和 NoOfLevels,但添加来自查询 1 的 'OverCount' 和 ODA 以及来自查询的 'UnderCount' 和 'ODA' 2.
想要的最终结果
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 制作 temp tables 然后制作一个新的 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 的总行数。使用 'SUM' 也会导致错误信息。最后,如果我删除 '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 |
我试过通过 Whosebug 寻找这个答案,但没有发现类似的问题,我发现了很多关于加入两个 table 的问题,但他们的问题并不相同.. . 我已经考虑过 UNION 但如果那是正确的下一步,我似乎无法理解。我认为部分问题是查询 1 具有不在查询 2 中的显示名称,反之亦然。让加入变得困难??
如果我需要澄清更多,请让我知道,我的大脑是糊状的。
尝试使用 full join
从两个表中获取所有唯一的 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
您可以使用完全联接从两个 table 中获取结果。欲了解更多信息,请访问 https://www.w3schools.com/sql/sql_join_full.asp
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