SQL使用特定值添加多行

时间:2016-01-12 12:57:18

标签: sql

我有一个表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

3 个答案:

答案 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

我想总结基本薪水和房屋津贴!