2016-11-04 5 views
0

this is 2 tablesКак добавить три таблицы в SQL Server

this is 2 tables

Скриншоты показывают таблицы для справки.

Моя цель состоит в том, чтобы получить мин-макс-Avg зарплату за состояние на дату

Я попробовал этот код

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» из вашего запроса является виновником:) ... Помните: без этого предложения where он будет объединяться со всеми записями, как вы ожидали. Но для двух состояний значение из employee_details после присоединения будет NULL. Итак, для вашего случая использования вам действительно нужно поставить это условие в предложение соединения. Dim_city.City_id = Employee_details.City_id и Month_ending = 20150131 – Nayak

0

Порядок присоединений также имеет значение, если вы используете ПОЛНЫЕ, ЛЕВЫЕ или ПРАВЫЕ СОЕДИНЕНИЯ.

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 
Смежные вопросы