2012-01-30 39 views
0

我呼籲個人5張桌子,dailypay,獎金,欠條和貸款想寫一個查詢,將生成工資該表的......我的代碼是與MySQL的問題JOIN語句

select personal.name as NAME, 
    (sum(dailypay.pay) + bonuses) - (iou.amount + loans.monthly_due)) as SALARY 
    from personal 
     join dailypay on personal.eid = dailypay.eid 
     left join bonuses on personal.eid = bonuses.eid 
     left join iou on personal.eid = iou.eid 
     left join where dailypay.date = 'specified_date' 
        and bonuses.date_approved = 'specified_date' 
        and iou.date_approved = 'specified_date' 
        and loans.date = month(now() 

它返回確實有紅利,iou和貸款記錄的員工的姓名和空薪水值。但我想總結他們的日常支付,扣除/增加扣除額或返回值,在沒有記錄的情況下,它應該繼續進行總和而沒有任何扣減。

回答

1

你粘貼代碼的時候,因爲有錯過了什麼沒有加入loans表。此外,您正在使用表bonuses作爲值,您還需要一個字段名稱。我爲連接和字段添加了一些代碼,但對於我未知的名稱使用???

將空值添加到其他值或將值減去其他值時,結果爲空,這就是爲什麼當缺少左連接表中的任何值時結果爲空的原因。您可以使用ifnull(..., 0)將空值變爲零。

您需要一個group by條款,否則它將總結所有人的工資。

如果我找到你的話,你在每個用戶的dailypay表中有幾條記錄,但是其他表中的每個用戶只有一條記錄?在這種情況下,您將遇到問題,您將加入dailypay中的每一行的其他表格,因此如果您有20個用戶的付款記錄,則它會計算獎金20次。您可以使用像max這樣的聚合來僅獲取一次該值。

您已經在where子句中爲left.joined表放置了條件,但這會將連接轉換爲內連接。您應該在每個join條款中都有這些條件。

select 
    personal.name as NAME, 
    (sum(dailypay.pay) + ifnull(max(bonuses.???), 0)) - (ifnull(max(iou.amount), 0) + ifnull(max(loans.monthly_due), 0)) as SALARY 
from 
    personal 
    inner join dailypay on personal.eid = dailypay.eid 
    left join bonuses on personal.eid = bonuses.eid and bonuses.date_approved = 'specified_date' 
    left join iou on personal.eid = iou.eid and iou.date_approved = 'specified_date' 
    left join loans on personal.??? = loans.??? and loans.date = month(now()) 
where 
    dailypay.date = 'specified_date' 
group by 
    personal.name 
+0

問題解決了,謝謝一堆。你搖滾。 – code4 2012-01-30 11:34:27

0

似乎是where之前extranous left join和缺少一個右括號)month(now()

所以它應該是這樣的:

select personal.name as NAME, 
(sum(dailypay.pay) + bonuses) - (iou.amount + loans.monthly_due)) as SALARY 
from personal 
    join dailypay on personal.eid = dailypay.eid 
    left join bonuses on personal.eid = bonuses.eid 
    left join iou on personal.eid = iou.eid 
    where dailypay.date = 'specified_date' 
       and bonuses.date_approved = 'specified_date' 
       and iou.date_approved = 'specified_date' 
       and loans.date = month(now()) 
+0

謝謝,缺少')'是一個錯字錯誤。試過你的代碼,但仍然沒有生成。 – code4 2012-01-30 10:53:12