按行选择按行选择

时间:2016-01-30 10:01:02

标签: sql sql-server-2008

我需要计算员工工资。

我有一个表和两个视图,其中包含我需要执行查询的数据,这里是表

Employees_View
--------
ID    Name    PayRate    PayUnit    Commission
1    James    10         C          0
2    Mike     10000      S          0
3    Jude     20000      SC         5
4    Clara    8          C          0

当PayUnit为C(佣金)时,PayRate为百分比,这是该员工总销售额的百分比,而佣金字段是总销售额的佣金百分比,仅适用于SC员工

工作

ID    Created
1     2016-01-21 10:56:05
2     2016-01-21 10:56:05
3     2016-01-21 10:56:05
4     2016-01-21 10:56:05
5     2016-01-21 12:11:59
6     2016-01-25 08:03:07
7     2015-11-01 22:55:22

Jobs_Item_View

Job_ID    Amount    Emp_ID
1        135         4
1        500         2
3        1500        2
3        250         4
4        1000        2
5        500         4
6        500         4
7        500         1

PayUnits

Code    Name
S       Salary   
C       Commission
SC      Salary plus Commission

这是我试过的

SELECT 
    ev.PayRate, 
    ev.name AS Employee, 
    CASE ev.PayUnitCode WHEN 'C' THEN 
        SUM(jiv.Amount) - (SUM(jiv.Amount) * (ev.PayRate / 100))  
    WHEN 'SC' THEN 
        ev.payrate + SUM(jiv.Amount) - (SUM(jiv.Amount) * (ev.Commission / 100))
    ELSE ev.payrate 
    END AS pay,
    LEFT(DATENAME(month, j.Created), 3) + '-' + CAST(YEAR(j.Created) AS NVARCHAR) AS Month, 
    jiv.Emp_ID, 
    pu.Name AS PayUnit, 
     ev.Code, ev.Commission
FROM 
    dbo.Employees_View AS ev LEFT OUTER JOIN
    dbo.Job_Items_View AS jiv  ON jiv.Emp_ID = ev.ID LEFT OUTER JOIN
    dbo.Jobs AS j ON j.ID = jiv.Job_ID LEFT OUTER JOIN
    dbo.PayUnits AS pu ON pu.Code = ev.PayUnitCode

GROUP BY jiv.Emp_ID, 
        pu.Name, 
        ev.PayUnitCode,
        ev.PayRate, ev.name, 
        LEFT(DATENAME(month, j.Created), 3) + '-' + CAST(YEAR(j.Created) AS NVARCHAR), 
        ev.Code, ev.Commission

这就是我得到的

结果

PayRate Employee pay   Month    Emp_ID  PayUnit                 Commission
20000   Jude    NULL   NULL     NULL    Salary plus Commission  5.00
10      James   900    Nov-2015 1       Commission              0.00
8       Clara   2760   Jan-2016 4       Commission              0.00
10000   Mike    10000  Jan-2016 2       Salary                  0.00

预期产出

结果

PayRate Employee pay     Month  Emp_ID  PayUnit                 Commission
20000   Jude    20241.75 Jan-2016   3       Salary plus Commission  5.00
10      James   900      Nov-2015   1       Commission              0.00
8       Clara   2760     Jan-2016   4       Commission              0.00
10000   Mike    10000    Jan-2016   2       Salary                  0.00

SC员工的薪酬是不正确的。假设是薪水(20000)加上5%或总销售额(4835),即241.75 - 20,241.75

1 个答案:

答案 0 :(得分:1)

空值的原因是其中一名员工没有为任何工作做出贡献,因此SUM(jiv.Amount)对他们来说总是null,任何涉及该表达式的计算也会导致{{1 }}。您可以通过执行null来解决问题。同样,对于日期,它们也受到工作数据的驱动,但如果员工没有参与任何工作,他们也将ISNULL(SUM(jiv.Amount), 0)null也可以用于这些。

我使用Common Table Expressions来解决问题:

ISNULL()

Click here to see it in action and have a play on SQL Fiddle

相关问题