我有一个表MonthlyTransaction,其中包含2列:paycode和Amount。 每个付费代码都有另一个表中特定ID的金额。我想为同一个ID添加2个特定数量的付款代码100和105。我也需要它们在同一行,并且不希望每个值都有额外的行。
这是我写的查询。输出总是2行,如果我删除WHERE
语句,它将超过2行,并将获得此特定ID的所有付费代码。
SELECT
EmpAssignment.EmployeeId,
profile.NAME,
Positions.PositionName,
Nations.NationName,
CASE
WHEN(MonthlyTransaction.paycode=100) THEN MonthlyTransaction.Amount
END AS BasicSalary,
CASE
WHEN(MonthlyTransaction.paycode=105) THEN MonthlyTransaction.Amount
END AS HouseAllowance
--(BasicSalary+HouseAllowance) AS TotalAmount
FROM
EmpAssignment
LEFT JOIN PROFILE ON PROFILE.ProfileId = Empassignment.EmpId
LEFT JOIN Positions ON Positions.PositionNo = EmpAssignment.EmpId
LEFT JOIN Nations ON Nations.nationid = Empassignment.EmpId
LEFT JOIN MonthlyTransaction ON MonthlyTransaction.EmpId = Empassignment.EmpId
LEFT JOIN paycode ON paycode.code = MonthlyTransaction.Paycode
WHERE
EmpAssignment.EmployeeId=102 AND
(
MonthlyTransaction.Paycode = 105 OR
MonthlyTransaction.Paycode = 100
)
GROUP BY
EmpAssignment.EmployeeId,
profile.NAME,
Positions.PositionName,
Nations.NationName,
MonthlyTransaction.Paycode,
MonthlyTransaction.Amount
ORDER BY
EmployeeId ASC
答案 0 :(得分:0)
SELECT EmpAssignment.EmployeeId , profile.NAME , Positions.PositionName , Nations.NationName ,
--CASE WHEN(MonthlyTransaction.paycode=100)THEN MonthlyTransaction.Amount END AS BasicSalary ,
--CASE WHEN(MonthlyTransaction.paycode=105)THEN MonthlyTransaction.Amount END AS HouseAllowance
MonthlyTransaction.Amount
FROM EmpAssignment
INNER JOIN PROFILE ON PROFILE.ProfileId = Empassignment.EmpId
LEFT JOIN Positions ON Positions.PositionNo = EmpAssignment.EmpId
INNER JOIN Nations ON Nations.nationid = Empassignment.EmpId
INNER JOIN MonthlyTransaction ON MonthlyTransaction.EmpId = Empassignment.EmpId
INNER JOIN paycode ON paycode.code = MonthlyTransaction.Paycode
WHERE EmpAssignment.EmployeeId=102
AND (MonthlyTransaction.Paycode = 105 OR MonthlyTransaction.Paycode = 100)
GROUP BY EmpAssignment.EmployeeId , profile.NAME , Positions.PositionName , Nations.NationName ,
MonthlyTransaction.Paycode,MonthlyTransaction.Amount
ORDER BY EmployeeId ASC
@jarlh
答案 1 :(得分:0)
问题在于您只需加入一次表(并获取任一值的所有实例)。你真正想要做的是连接两次表(因为你想要返回的每一行中有两个实例),并且每个连接都是一个单独的值。
SELECT
EA.EmployeeId,
PR.NAME,
POS.PositionName,
N.NationName,
BS.Amount AS BasicSalary,
HA.Amount AS HouseAllowance
FROM
EmpAssignment EA
LEFT JOIN PROFILE PR ON PR.ProfileId = EA.EmpId
LEFT JOIN Positions POS ON POS.PositionNo = EA.EmpId
LEFT JOIN Nations N ON N.nationid = EA.EmpId
LEFT JOIN MonthlyTransaction BS ON
BS.EmpId = EA.EmpId AND
BS.paycode = 100
LEFT JOIN MonthlyTransaction HA ON
HA.EmpId = EA.EmpId AND
HA.paycode = 105
WHERE
EmpAssignment.EmployeeId=102
GROUP BY
EA.EmployeeId,
PR.NAME,
POS.PositionName,
N.NationName,
BS.Amount,
HA.Amount
ORDER BY
EA.EmployeeId ASC
答案 2 :(得分:0)
SELECT
EmpAssignment.EmployeeId,
profile.NAME,
Positions.PositionName,
Nations.NationName,
SUM( CASE
WHEN(MonthlyTransaction.paycode=100) THEN MonthlyTransaction.Amount
END) AS BasicSalary,
SUM( CASE
WHEN(MonthlyTransaction.paycode=105) THEN MonthlyTransaction.Amount
END) AS HouseAllowance
FROM EmpAssignment
LEFT JOIN PROFILE ON PROFILE.ProfileId = Empassignment.EmpId
LEFT JOIN Positions ON Positions.PositionNo = EmpAssignment.EmpId
LEFT JOIN Nations ON Nations.nationid = Empassignment.EmpId
LEFT JOIN MonthlyTransaction ON MonthlyTransaction.EmpId = Empassignment.EmpId
LEFT JOIN paycode ON paycode.code = MonthlyTransaction.Paycode
WHERE
EmpAssignment.EmployeeId=102 AND
(
MonthlyTransaction.Paycode = 105 OR
MonthlyTransaction.Paycode = 100
)
GROUP BY
EmpAssignment.EmployeeId,
profile.NAME,
Positions.PositionName,
Nations.NationName
ORDER BY
EmployeeId ASC
我想总结基本薪水和房屋津贴!