2013-07-28 3 views
2

У меня есть две таблицы employees, salary_advance.Оператор SQL для выбора из двух таблиц

employees таблица имеет столбцы empid, name, salary и salary_advance имеет id, empid, amount, date

Я хочу, чтобы показать имя, зарплату, оставаясь для всех сотрудников ..

remaining = (salary - amount) 

когда я внутреннее соединение я получаю только сотрудников, которые берут аванс ..

Я хочу показать, кто забирает аванс + другие работники в штате.

Это мой SQL заявление

select 
    employees.name , employees.salary , 
    (employees.salary - salary_advance.amount) 
from 
    employees 
inner join 
    salary_advance on employees.empid = salary_advance.empid 
+2

Используйте 'LEFT OUTER JOIN' вместо' ВНУТРЕННИЙ JOIN' –

+0

Может ли работник получить более одного заранее? –

+0

У меня все еще есть проблема. Да, один сотрудник может получить более одного наступления. Я хочу показать, сколько он занимает, а остальные и указать дату. если никто не заблагорассудится, просто покажите всем сотрудникам – user1389105

ответ

1

Попробуйте это:

select 
    employees.name , employees.salary , 
    Remaining = (employees.salary - ISNULL(salary_advance.amount, 0)) 
from 
    employees 
left join 
    salary_advance on employees.empid = salary_advance.empid 

ЛЕВАЯ ПРИСОЕДИНЯЙСЯ ключевое слово возвращает все строки из левой таблицы, с соответствующими строками в таблице справа.

+0

Это дает «NULL» в качестве оставшейся зарплаты, если нет аванса. –

+0

ok no more ..... – Brian

4

Вы должны будете использовать LEFT OUTER JOIN вместо вашего INNER JOIN, и вы также хотите использовать ISNULL, чтобы получить 0 вместо NULL из salary_advance таблицы:

SELECT 
    employees.name, 
    employees.salary, 
    Remaining = (employees.salary - ISNULL(salary_advance.amount, 0)) 
FROM 
    employees 
LEFT OUTER JOIN 
    salary_advance ON employees.empid = salary_advance.empid 
+0

@ user1389105: ну, вы просто добавляете предложение WHERE' ..... –

+0

+1, но какой dbms использует '=' для псевдонима? –

+0

@RaviThapliyal: Это для Microsoft SQL Server –

1

Распечатать эту:

select 
    employees.name, 
    employees.salary, 
    Remaining = (employees.salary - ISNULL(salary_advance.amount, 0)) 
from 
    employees 
left outer join 
    salary_advance on employees.empid = salary_advance.empid 

вместо этого:

select 
    employees.name , employees.salary , 
    (employees.salary - salary_advance.amount) 
from 
    employees 
inner join 
    salary_advance on employees.empid = salary_advance.empid 

Резюме: Вы должны использовать left outer join вместо inner join

2

Если работник может иметь более чем один шаг вперед, вы хотите использовать LEFT JOIN с SUM и GROUP BY, чтобы получить правильный результат. Если вам нужно засчитывать только авансы с определенной даты, добавьте это в пункт ON в LEFT JOIN;

SELECT employees.name , employees.salary , 
     (employees.salary - COALESCE(SUM(salary_advance.amount),0)) remaining 
FROM employees 
LEFT JOIN salary_advance 
    ON employees.empid = salary_advance.empid 
AND salary_advance.date >= '2012-01-01' 
GROUP BY employees.name, employees.salary 

An SQLfiddle to test with.

+0

Обновлено с условием даты. –

2

Используйте левую присоединиться, и заботиться о нулевых значений:

select 
    e.name , e.salary, 
    employees.salary - isnull(a.amount, 0) 
from 
    employees e 
left outer join 
    salary_advance a on e.empid = a.empid 

isnull функция может быть названа ifnull, в зависимости от того, что базы данных вы используете.

2

Также вы можете использовать:

SELECT 
    employees.name, 
    employees.salary, 
    (CASE salary_advance.amount 
      WHEN NULL THEN employees.salary 
      ELSE employees.salary - salary_advance.amount 
     END 
    ) Remaining 
FROM 
    employees 
LEFT OUTER JOIN 
    salary_advance ON employees.empid = salary_advance.empid