0

複数の「With」ステートメントを組み込んだ関数を作成しようとしています。

私の元のクエリは次のとおりです。

WITH EmpCount as 
  (
    SELECT job.EmployeeID, assign.PropertyID FROM EmployeeJobstatus job 
    JOIN Assignment assign ON job.JobID = assign.ID  GROUP by job.EmployeeID,
    assign.PropertyID
  ),
    NoDup as 
  (
    SELECT EmployeeID, Count(employeeID) as NO from EmpCount 
    Group by EmployeeID HAVING count(Employeeid) > 1
  )

    SELECT prop.Name, job.EmployeeID, Emp.EmpID, Emp.Name 
    from EmployeeJobStatus job
    JOIN Assignment assign ON assign.id = job.jobid
    JOIN Property prop ON prop.ID = assign.PropertyID
    JOIN Employee emp on emp.ID = job.EmployeeID
    WHERE EmployeeID IN (SELECT EmployeeID from NoDup)
    GROUP By prop.Name, EmployeeID, emp.EmpID,Emp.Name
    Order BY EmployeeID

これは以下を返します:

Name           EmployeeID   EmpID         Name
Property 1      23         1286333      LastNameRemoved1, Rachel A
Property 2      23         1286333      LastNameRemoved1, Rachel A
Property 2      76         1268329      LastNameRemoved2, Tamer A
Property 1      76         1268329      LastNameRemoved2, Tamer A
Property 3      135        1411933      LastNameRemoved3, Sarah E
Property 1      135        1411933      LastNameRemoved2, Sarah E

私の関数は、EmployeeJobStatus の StartDate と EndDate のフィールドを利用して、クロス プロパティであるかどうかに応じて「Y」または「N」を返す必要があります。

私は自分の機能を開始したばかりで、次に何をすべきかわからない.

CREATE function dbo.IsEmployeeCrossPropertyOnDate
 (@EmpID int, @AsOfDate datetime) 
  RETURNS INT AS

どんな助け、または正しい方向への微調整も大歓迎です。ありがとうございました。

4

1 に答える 1

0

これはどう...

CREATE FUNCTION dbo.IsEmployeeCrossPropertyOnDate
    (
        @empid int
        , @asofdate datetime
    )
RETURNS TABLE
AS
RETURN
    SELECT
        CASE MIN(a.propertyid)
            WHEN MAX(a.propertyid)
                THEN 'N'
            ELSE 'Y'
        END CrossProp
    FROM 
        EmployeeJobStatus j
    JOIN 
        Assignment a
        ON a.id = j.jobid
    WHERE 
        j.employee = @empid
        AND j.startdate <= @AsOfDate
        AND j.endDate > @AsOfDate
    GROUP BY 
        j.employeeid;

編集:

クロスするのではなく、おそらく外側に適用するでしょう。ヌルは、その時点で割り当てのない従業員になります。

編集2:

あなたが尋ねたので、以下はスカラー関数です。スカラーに注意してください。クエリのどこで使用するかに応じて、BEGINENDブロックはオプティマイザをだましてRBARに移行させることができます。

CREATE FUNCTION dbo.IsEmployeeCrossPropertyOnDate
    (
        @empid int
        , @asofdate datetime
    )
RETURNS CHAR(1)
AS
BEGIN
    DECLARE @res CHAR(1) = 'N';

    SELECT @res = 
        CASE MIN(a.propertyid)
            WHEN MAX(a.propertyid)
                THEN 'N'
            ELSE 'Y'
        END 
    FROM 
        EmployeeJobStatus j
    JOIN 
        Assignment a
        ON a.id = j.jobid
    WHERE 
        j.employee = @empid
        AND j.startdate <= @AsOfDate
        AND j.endDate > @AsOfDate
    GROUP BY 
        j.employeeid;

    RETURN @res;
END;
于 2012-12-06T22:53:59.350 に答える