【问题标题】:SQL complex join query with sum带有 sum 的 SQL 复杂连接查询
【发布时间】:2014-12-02 06:42:45
【问题描述】:

我正在尝试根据组合键(Organizationunitid 和 payrollcodeid)唯一的列(sysprocode)获取金额总和。到目前为止,我已经设法根据 Organizationunitid 和 payrollcodeid 获取金额,但不是在 sysprocode.A 旁边看看我的 SQLfiddle 应该更清楚这一点 Click 这里我试过这个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 sample output 中的示例输出

【问题讨论】:

  • 你想要什么输出,在你的问题中添加示例输出数据

标签: sql group-by sum jointable


【解决方案1】:

检查以下查询是否有效,但我认为计算养老金有问题,因为 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

【讨论】:

【解决方案2】:

摸索后终于解决了

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)

点击HERE查看SQLFIDDLE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多