2017-08-04 74 views
1

我有兩個表格,我想加入創建一個最終表格。結合SQL服務器中不同行數的兩個表格

查詢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 #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   | 

我試圖通過計算器,但避風港」尋找這個答案我發現有很多問題需要加入兩張牌,但他們的問題並不相同......我認爲聯盟,但是如果下一步是正確的話,我似乎無法控制我的頭腦。問題的一部分是,查詢1具有不在查詢2中的DisplayNames,反之亦然。難以加入?

如果我需要澄清更多,請讓我知道,我的大腦是糊塗的。

回答

2

嘗試使用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不會出現所有組合。但是,您呈現的第二個查詢完美無缺!我會將這個思考過程添加到我以前的工作中!謝謝! – 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