【发布时间】:2014-06-05 18:57:21
【问题描述】:
我正在尝试导出员工考勤卡信息。出口工作正常,但我试图考虑员工的小费。员工收到的小费是基于工作小时数除以特定部门的总小时数乘以小费金额。例如:
位置 1 有 5 名员工。 2组
经理 - 没有资格获得小费 员工 - 有资格获得小费
我需要获取“员工”组的总小时数,以及员工组中员工的总小时数。
假设员工组本周有 111 小时。员工的工作时间是:
Jim: 22
Bob: 32
Pete: 29
Dave: 28
本周的小费是 100.00 美元
要找到每个成员的提示,我会这样做:
Jim's Tip: 22/111 * 100 = $19.82
Bob's Tip: 32/111 * 100 = $28.83
Pete's Tip: 29/111 * 100 = $26.13
Dave's Tip: 28/111 * 100 = $25.23
最后一部分是经理 Tim,没有资格获得小费,但需要包含在我的导出中。
我可以让查询单独运行:
1) to run for just the groups eligible for tips and calculate the tip
2) to run for all employees leaving tip out.
这是我得到的输出:
Name Location OtherNumber RegHours OT Hours TIP
Jim's 1 12345 22 0 $19.82
Bob's 1 12395 32 0 $28.83
Pete's 1 31654 29 0 $26.13
Dave's 1 03948 28 0 $25.23
这是我应该得到的输出:
Name Location OtherNumber RegHours OT Hours TIP
Tim 1 30984 40 0 $0
Jim's 1 12345 22 0 $19.82
Bob's 1 12395 32 0 $28.83
Pete's 1 31654 29 0 $26.13
Dave's 1 03948 28 0 $25.23
这是我的代码:
获取“所有”员工的代码,不考虑组
SELECT ftc.sFirstName + ' ' + ftc.sLastName AS sName, Account.sLocationDesc, Employees.sOtherNumber, SUM(ftc.RegHours) AS RegHours, SUM(ftc.OTHours)
AS OTHours
FROM dbo.fTimeCard(@StartDate, @EndDate, @DeptList, @iActive, @EmployeeList) AS ftc LEFT OUTER JOIN
Employees ON ftc.lEmployeeID = Employees.lEmployeeID LEFT OUTER JOIN
Account ON
(SELECT CASE WHEN Employees.lLocationID IS NULL THEN 1 ELSE Employees.lLocationID END AS Expr1
FROM Employees
WHERE (lEmployeeID = ftc.lEmployeeID)) = Account.lLocationID
WHERE (ftc.RegHours > 0) AND (ftc.RegHours IS NOT NULL)
GROUP BY Account.sLocationDesc, Employees.sOtherNumber, ftc.lEmployeeID, ftc.sLastName, ftc.sFirstName
这是我找出提示的代码,以及每个员工应该从符合条件的组中获得多少:
SELECT t3.sName, t3.TotalHours, t3.TotalHours / t4.TotalDepartmentHours * @TIP AS Tip
FROM (SELECT ftc.sFirstName + ' ' + ftc.sLastName AS sName, SUM(ftc.RegHours) + SUM(ftc.OTHours) AS TotalHours, ftc.lEmployeeID
FROM dbo.fTimeCard(@StartDate, @EndDate, @DeptListTip, @iActive, @EmployeeList) AS ftc LEFT OUTER JOIN
Employees ON ftc.lEmployeeID = Employees.lEmployeeID LEFT OUTER JOIN
Account ON
(SELECT CASE WHEN Employees.lLocationID IS NULL THEN 1 ELSE Employees.lLocationID END AS Expr1
FROM Employees
WHERE (lEmployeeID = ftc.lEmployeeID)) = Account.lLocationID
WHERE (ftc.RegHours > 0) AND (ftc.RegHours IS NOT NULL)
GROUP BY ftc.lEmployeeID, ftc.sLastName, ftc.sFirstName) AS t3 CROSS JOIN
(SELECT SUM(ftc.RegHours) + SUM(ftc.OTHours) AS TotalDepartmentHours
FROM dbo.fTimeCard(@StartDate, @EndDate, @DeptListTip, @iActive, @EmployeeList) AS ftc LEFT OUTER JOIN
Employees AS Employees_1 ON ftc.lEmployeeID = Employees_1.lEmployeeID LEFT OUTER JOIN
Account AS Account_1 ON
(SELECT CASE WHEN Employees.lLocationID IS NULL THEN 1 ELSE Employees.lLocationID END AS Expr1
FROM Employees
WHERE (lEmployeeID = ftc.lEmployeeID)) = Account_1.lLocationID
WHERE (ftc.RegHours > 0) AND (ftc.RegHours IS NOT NULL)) AS t4
这是我的查询结合两者,其中输出不包括“蒂姆”经理”
SELECT t1.sName, t1.sLocationDesc, t1.sOtherNumber, t1.RegHours, t1.OTHours, t2.Tip
FROM (SELECT ftc.sFirstName + ' ' + ftc.sLastName AS sName, Account.sLocationDesc, Employees.sOtherNumber, SUM(ftc.RegHours) AS RegHours, SUM(ftc.OTHours)
AS OTHours, ftc.lEmployeeID
FROM dbo.fTimeCard(@StartDate, @EndDate, @DeptList, @iActive, @EmployeeList) AS ftc LEFT OUTER JOIN
Employees ON ftc.lEmployeeID = Employees.lEmployeeID LEFT OUTER JOIN
Account ON
(SELECT CASE WHEN Employees.lLocationID IS NULL THEN 1 ELSE Employees.lLocationID END AS Expr1
FROM Employees
WHERE (lEmployeeID = ftc.lEmployeeID)) = Account.lLocationID
WHERE (ftc.RegHours > 0) AND (ftc.RegHours IS NOT NULL)
GROUP BY Account.sLocationDesc, Employees.sOtherNumber, ftc.lEmployeeID, ftc.sLastName, ftc.sFirstName) AS t1 INNER JOIN
(SELECT t3.sName, t3.TotalHours, t3.TotalHours / t4.TotalDepartmentHours * @TIP AS Tip, t3.lEmployeeID
FROM (SELECT ftc.sFirstName + ' ' + ftc.sLastName AS sName, SUM(ftc.RegHours) + SUM(ftc.OTHours) AS TotalHours, ftc.lEmployeeID
FROM dbo.fTimeCard(@StartDate, @EndDate, @DeptListTip, @iActive, @EmployeeList) AS ftc LEFT OUTER JOIN
Employees AS Employees_2 ON ftc.lEmployeeID = Employees_2.lEmployeeID LEFT OUTER JOIN
Account AS Account_2 ON
(SELECT CASE WHEN Employees.lLocationID IS NULL THEN 1 ELSE Employees.lLocationID END AS Expr1
FROM Employees
WHERE (lEmployeeID = ftc.lEmployeeID)) = Account_2.lLocationID
WHERE (ftc.RegHours > 0) AND (ftc.RegHours IS NOT NULL)
GROUP BY ftc.lEmployeeID, ftc.sLastName, ftc.sFirstName) AS t3 CROSS JOIN
(SELECT SUM(ftc.RegHours) + SUM(ftc.OTHours) AS TotalDepartmentHours
FROM dbo.fTimeCard(@StartDate, @EndDate, @DeptListTip, @iActive, @EmployeeList) AS ftc LEFT OUTER JOIN
Employees AS Employees_1 ON ftc.lEmployeeID = Employees_1.lEmployeeID LEFT OUTER JOIN
Account AS Account_1 ON
(SELECT CASE WHEN Employees.lLocationID IS NULL THEN 1 ELSE Employees.lLocationID END AS Expr1
FROM Employees
WHERE (lEmployeeID = ftc.lEmployeeID)) = Account_1.lLocationID
WHERE (ftc.RegHours > 0) AND (ftc.RegHours IS NOT NULL)) AS t4) AS t2 ON t1.lEmployeeID = t2.lEmployeeID
您会注意到它基本上是相同的查询,除了我为组使用了不同的参数...我在一个中使用 @DeptList 并将其设置为“全部”,然后使用 @DeptListTip 并将其设置为特定组,在本例中为“员工”
【问题讨论】:
-
@DeptListTip 是字符串还是表值参数?
-
表值参数
标签: sql sql-server sql-server-2008 sql-server-2005 parameters