2016-11-04 40 views
0

this is 2 tables如何在SQL Server

this is 2 tables

添加三個表的屏幕截圖顯示了參考表。

我的目標是獲取每個國家最小 - 最大,平均工資日期

我想這個代碼

select 
    s.Descrip, 
    MIN(Salary) AS Minimum_per_state, 
    MAX(Salary) AS Maximum_per_state, 
    AVG(Salary) AS Average_per_state 
from 
    (select 
     Month_ending, 
     Emp_id,Salary, 
     Descrip 
    from 
     Dim_state 
    full join 
     Dim_city ON Dim_state.State_id = Dim_city.State_id 
    full join 
     Employee_details ON Dim_city.City_id = Employee_details.City_id 
    where 
     Month_ending = 20150131) s 
GROUP BY 
    Descrip 

,但我得到這樣的輸出:

description min_sal max_sal avg_sal 
Delhi  30000 34000 32000 
maharastra 25000 35000 30000 
tamil nadu 35000 50000 42000 
Westbengal 25000 50000 37500 

問題是班加羅爾和果阿丟失。

我可以知道哪部分出了問題嗎?

回答

0

你有內部查詢的結果是什麼?

你可以直接嘗試這個(只使用左連接,並沒有使用內部查詢)?

SELECT ds.descip 
    ,min(salary) min_salary 
    ,max(salary) max_salary 
    ,avg(salary) avg_salary 
FROM dim_state ds 
LEFT JOIN dim_city dc ON ds.state_id = dc.state_id 
LEFT JOIN employee_details ed ON ed.city_id = dc.city_id 
WHERE Month_ending = 20150131 
GROUP BY ds.descip 
+0

我想你的代碼得到什麼我提到的相同輸出在問題中只有4條記錄。 @nayak – sekharvarma

+0

「Month_ending = 20150131」from your query is the culprit:)... 記住:如果沒有這個where子句,它會按照您的預期連接所有記錄。但是對於這兩個狀態,加入後來自employee_details的值將爲NULL。 因此,對於您的用例,您真正需要的是將該條件放入連接子句中。 Dim_city.City_id = Employee_details.City_id and Month_ending = 20150131 – Nayak

0

的,當你使用FULL,左或右連接聯接也很重要訂單。

SELECT ds.descip 
,min(salary) min_salary 
,max(salary) max_salary 
,avg(salary) avg_salary 
FROM employee_details ed 
     LEFT JOIN dim_city dc ON ed.city_id= dc.city_id 
     LEFT JOIN dim_state ed ON dc.state_id = dc.state_id 
      WHERE Month_ending = 20150131 
      GROUP BY ds.descip 
0

其實你錯過了一點。 dim_state有PK,這樣會在左側,而dim_city有FK,所以這將是在右側,以便使右連接

SELECT ds.descip 
,min(salary) min_salary 
,max(salary) max_salary 
,avg(salary) avg_salary 
FROM dim_state ds 
RIGHT JOIN dim_city dc ON ds.state_id = dc.state_id 
FULL JOIN employee_details ed ON ed.city_id = dc.city_id 
WHERE Month_ending = 20150131 
GROUP BY ds.descip