2014-02-25 38 views
1

我有这个函数返回在特定课程上工作的工作人员的成本,课程可以有一个或多个实验室辅助和一个或多个工作人员个人,只要有只有一名工作人员和一名助理在特定课程上工作,我想让它适用于任何人员和助理的工作量,我如何扩展此功能以获得该功能?扩展SQL函数的功能

ALTER FUNCTION [dbo].[getCourseCost] 
(
    @CourseCode varchar(50), 
    @Year nchar(10), 
    @Period nchar(10) 
) 
RETURNS int 
AS 
BEGIN 
DECLARE @SSN_staff varchar(50) 
DECLARE @Salary_staff int 
DECLARE @Hours_staff int 
DECLARE @Cost_staff int 
DECLARE @Cost_labass int 

SELECT @SSN_staff = SSN FROM Attended_By WHERE Period = @Period AND Year = @Year AND CourseCode = @CourseCode 
SELECT @Salary_staff = Salary FROM Staff WHERE SSN = @SSN_staff 
SELECT @Hours_staff = Hours FROM Attended_By WHERE Period = @Period AND Year = @Year AND CourseCode = @CourseCode 
SELECT @Cost_labass = (Hours * Salary) FROM Labass WHERE Period = @Period AND Year = @Year AND CourseCode = @CourseCode 

SET @Cost_staff = @Salary_staff * @Hours_staff 
IF @Cost_staff is NULL 
BEGIN 
SET @Cost_staff = 0 
END 

IF @Cost_labass is NULL 
BEGIN 
SET @Cost_labass = 0 
END 

RETURN @Cost_staff + @Cost_labass 
END 
+0

虽然我大概可以从上面的代码猜估,用为了使问题是回答更容易,您可以定义“Attended_By”,“Staff”和“Labass”表的用途以及这些列的含义。 –

回答

3

我不得不做出从你的代码的表的一些假设,因为我没有明确肯定它们是什么,但假设Attended_By.Hours是由工作人员执行成员出席的小时数当然,和Staff.Salary决定每小时工作人员的成本,下面的查询应该给你一个单一的成本在球场上的所有工作人员:

SELECT @Cost_Staff = SUM(A.Hours * S.Salary) 
    FROM Attended_By A 
    INNER JOIN Staff S ON S.SSN = A.SSN 
    WHERE (Period = @Period AND 
     Year = @Year AND 
     CourseCode = @CourseCode) 

这将总结所有的营业时间为每个工作人员乘以由他们各自的工资。 使用上述内容,您可以免除@SSN_staff@Salary_staff@Hours_staff的全部三个SELECT

我相信,你正在使用的实验室助手查询应该已经返回总,如果你使用SUM功能:

SELECT @Cost_labass = SUM(Hours * Salary) 
    FROM Labass 
    WHERE (Period = @Period AND 
     Year = @Year AND 
     CourseCode = @CourseCode) 
+1

是的,这是正确的,非常感谢您的快速回答。 – Jacco