2017-08-04 4 views
1

1つの最終テーブルを作成するために2つのテーブルを結合したいと思います。SQLサーバー内の異なる行数の2つのテーブルを結合します

クエリ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を保つが、クエリ2

募集最終結果からクエリ1と「過少に」と「ODA」から「オーバー」と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列は正しいように見えますが、「過少に」値が正しくありません。このクエリの '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   | 

を私はstackoverflowのが、避難所「を介して、この答えを探してみました同じような問題が見つかったので、2つのテーブルに参加することを尋ねる質問がたくさんありましたが、それらの問題は同じではありません... UNIONを考慮しましたが、それが正しい次のステップであれば私の頭を包み込むようです。問題の一部は、クエリ1にはクエリ2にないDisplayNamesがあり、逆の場合はその逆であるということです。

詳細を明らかにする必要がある場合は、私の脳がマッシュアップしてください。

両方のテーブルから

答えて

2

、すべてのユニークなのDisplayName、カテゴリーを取得するためにfull joinを使用してみてください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 
+1

をご覧ください:) – BICube

+0

を最初のクエリは、私が望んでいたすべての必要な情報を提供し、いくつかのT1でDisplayNamesなどがあるので、しかし、それは特定の列を選択することが困難になりますt2では、t1.displaynamesを使用してもすべての組み合わせが表示されるわけではありません。しかし、あなたが提示した2番目のクエリは完全に機能します!私は以前の仕事にその思考プロセスを追加する予定です!ありがとうございました! – MartyB

0

に合流せずに条件付き集約を使用することです両方のテーブルの結果。詳細については、私はより多くの第二の溶液を好き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 
関連する問題