2013-07-28 135 views
2

我有兩個表employees, salary_advance從兩個表中選擇SQL語句

employees表中的列empid, name, salarysalary_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',而不是'INNER 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 

的LEFT JOIN關鍵字返回所有行左表中,與右表中的匹配行。

+0

如果沒有前進,這會給出'NULL'作爲剩餘工資。 –

+0

確定沒有更多..... – Brian

4

你需要使用LEFT OUTER JOIN,而不是你INNER JOIN,你也需要使用ISNULLsalary_advance表得到的0而不是NULL

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 JOINSUMGROUP BY,以獲得正確的結果。如果您只需計算自某個日期以來的預付款,請將其添加到LEFT JOINON條款;

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