簡體   English   中英

帶和的SQL復雜聯接查詢

[英]SQL complex join query with sum

我正在嘗試根據組合鍵(Organizationunitid和payrollcodeid)唯一的列(sysprocode)獲取金額總和。到目前為止,我已經設法根據Organisationunitid和payrollcodeid來獲取金額,但沒有與sysprocode一起使用。 SQLfiddle應該進一步闡明這一點單擊此處,我已經嘗試過此sql查詢

SELECT TB1.OUId,TB1.OUName,(TB2.Amount - TB3.ManualDeduction) AS amt
FROM 
( 
SELECT ou.OrganizationUnitID AS OUId,ou.OrganizationUnitName AS OUName 
FROM OrganizationUnits ou 
) TB1, 
(SELECT e.OrganizationUnitID AS OUId,SUM(trn.Amount) AS Amount 
FROM Employees e 
LEFT JOIN tblPeriodTransactions trn ON (e.EmployeeID=trn.Employee_ID) 
 where trn.Period_Month =6 and trn.Period_Year=2013 and trn.PayrollCode_ID=2
GROUP BY e.OrganizationUnitID 
)TB2, 
(SELECT e.OrganizationUnitID AS OUId,SUM(ep.ManualDeduction) AS ManualDeduction 
FROM Employees e 
LEFT JOIN tblEmployeePension ep ON (e.EmployeeID=ep.Employee_ID) 
GROUP BY e.OrganizationUnitID 
)TB3 
WHERE (TB2.OUId=TB1.OUId) 
AND (TB3.OUId=TB1.OUId)

這是imgur 示例輸出中的示例輸出

檢查以下查詢是否正常工作,但我認為計算養老金是有問題的,因為tblEmployeePension中沒有PayrollCode_ID:

SELECT 
    OU.OrganizationUnitID,
    OU.OrganizationUnitName,
    SPC.sysprocode,
    PC.PayrollCode_ID,
    SUM(PD.Amount),
    (SELECT SUM(tblEmployeePension.ManualDeduction) FROM tblEmployeePension WHERE Employee_ID IN (SELECT Employee_ID FROM Employees WHERE OrganizationUnitID = OU.OrganizationUnitID)) AS Pension,
    SUM(PD.Amount) - (SELECT SUM(tblEmployeePension.ManualDeduction) FROM tblEmployeePension WHERE Employee_ID IN (SELECT Employee_ID FROM Employees WHERE OrganizationUnitID = OU.OrganizationUnitID)) as amt
FROM 
    tblPeriodTransactions PD
INNER JOIN
    Employees E
ON 
    PD.Employee_ID = E.EmployeeID
INNER JOIN
    OrganizationUnits OU
ON
    E.OrganizationUnitID = OU.OrganizationUnitID
INNER JOIN
    tblPayrollCode PC
ON
    PD.PayrollCode_ID = PC.PayrollCode_ID
INNER JOIN
    sysprocodes SPC
ON
    SPC.organisationunitid = OU.OrganizationUnitID AND
    SPC.PayrollCode_ID = PC.PayrollCode_ID
GROUP BY
    OU.OrganizationUnitID,
    PC.PayrollCode_ID,
    SPC.sysprocode,
    OU.OrganizationUnitName

我摸索了一下終於解決了

SELECT TB4.Syscode,
CASE TB4.accountType WHEN 'c' THEN concat('-', (TB2.Amount - TB3.ManualDeduction)) 
ELSE (TB2.Amount - TB3.ManualDeduction) end AS amount
FROM 
( 
SELECT ou.OrganizationUnitID AS OUId,ou.OrganizationUnitName AS OUName 
FROM OrganizationUnits ou 
) TB1, 
(SELECT e.OrganizationUnitID AS OUId,SUM(trn.Amount) AS Amount 
FROM Employees e 
LEFT JOIN tblPeriodTransactions trn ON (e.EmployeeID=trn.Employee_ID) 
WHERE trn.Period_Month = 6 
AND trn.Period_Year = 2013 
AND trn.PayrollCode_ID = 2
GROUP BY e.OrganizationUnitID 
)TB2, 

(SELECT e.OrganizationUnitID AS OUId,SUM(ep.ManualDeduction) AS ManualDeduction 
FROM Employees e 
LEFT JOIN tblEmployeePension ep ON (e.EmployeeID=ep.Employee_ID) 
GROUP BY e.OrganizationUnitID 
)TB3,
(SELECT ou.OrganizationUnitID AS OUId,sp.sysprocode as Syscode,sp.accountType AS accountType
FROM OrganizationUnits ou    
INNER JOIN sysprocodes sp ON (ou.OrganizationUnitID=sp.organisationunitid) 
INNER JOIN  tblpayrollcode pc ON (pc.PayrollCode_ID = sp.PayrollCode_ID)
where sp.PayrollCode_ID = 2
GROUP BY ou.OrganizationUnitID,sp.sysprocode,sp.PayrollCode_ID,sp.accountType 
)TB4
WHERE (TB2.OUId=TB1.OUId) 
AND (TB3.OUId=TB1.OUId) 
AND(TB4.OUId =tb3.OUId)

單擊此處查看SQLFIDDLE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM