0

저장 프로 시저에서 예상되는 결과를 계산하는 스크립트를 만들려고합니다. BatchId를 공유하는 sp와 관련된 여러 테이블이 있습니다. x_NonFullTimeEmployees은 길이가 MeasurementStartDateMeasurementStartDate 사이의 길이와 동일한 StatusString 열을가집니다. I.E. 7 일 동안 'TAAAAAA'처럼 보일 수 있습니다. 같은 기간에 타임 카드를 선택하고 그 값을 합산합니다. 내 문제는 StartDate가 StatusString에서 'A'로 표시되는 날의 TimeCard 값만 사용하려는 것입니다. 어떻게해야합니까?날짜 범위 내의 요일을 기준으로 하위 문자열을 선택하는 방법

DECLARE @batchid INT = 1; 

WITH CTE_ACTIVENFS 
AS 
(
    select e.EmployeeId,e.OrganizationId,e.MeasurementStartDate, e.MeasurementEndDate 
    from x_VHEActiveNonFullTimeEmployees e 
    where BatchId = @batchid 
) 
, 
CTE_RESULTS 
AS 
(
    SELECT tc.OrganizationId ,tc.EmployeeId, SUM(tc.workhour) AS "Total Paid Hours", 
    DATEDIFF(month, (SELECT TOP 1 StartDate FROM TimeCard WHERE EmployeeId = tc.EmployeeId),(SELECT TOP 1 StartDate FROM TimeCard WHERE EmployeeId = tc.EmployeeId ORDER BY StartDate DESC)) 
    AS "Total Paid Period", 
    SUM(tc.workhour)/ DATEDIFF(month, (SELECT TOP 1 StartDate FROM TimeCard WHERE EmployeeId = tc.EmployeeId),(SELECT TOP 1 StartDate FROM TimeCard WHERE EmployeeId = tc.EmployeeId ORDER BY StartDate DESC)) 
    AS "Average Worked Hours" 
    FROM TimeCard tc INNER JOIN CTE_ACTIVENFS hire ON hire.EmployeeId = tc.EmployeeId 
    WHERE tc.EmployeeId IN (SELECT EmployeeId FROM CTE_ACTIVENFS) 
    AND tc.StartDate BETWEEN (SELECT TOP 1 MeasurementStartDate FROM CTE_ACTIVENFS) AND (SELECT TOP 1 MeasurementEndDate FROM CTE_ACTIVENFS) 
    AND tc.OrganizationId = (SELECT TOP 1 OrganizationId FROM CTE_ACTIVENFS) 
    GROUP BY tc.EmployeeId, tc.OrganizationId 
) 
SELECT * FROM CTE_RESULTS 

답변

1

먼저 귀하의 검색어가 엉망이라고 말하고 싶습니다. SELECT TOP 1은 조인으로 트렁크되어야합니다. 이제 귀하의 질문에 대해 다음과 같이 할 것입니다 :

select * 
from x_NonFullTimeEmployees hire 
inner join timecard tc 
    on tc.EmployeeId = hire.EmployeeId 
    and tc.StartDate between hire.MeasurementStartDate and hire.MeasurementEndDate 
    and substring(
    hire.StatusString, 
    datediff(dd, hire.MeasurementStartDate, tc.StartDate) +1, 
    1) = 'A' 
where hire.BatchId = @batchid 
+0

감사의 말투, 죄송합니다. 난 그냥 내 SQL 훈련을 시작하고있다 –

+0

당신은 조인에 대해 자세히 설명해 주 시겠어요 –

+0

@AntarrByrd 예를 들어'어디서 ... 그리고 tc.OrganizationId = (SELECT TOP 1 OrganizationId CTE_ACTIVENFS)'는'FROM TimeCard tc INNER JOIN CTE_ACTIVENFS hire ON ... 그리고 tc.OrganizationId = hire.OrganizationId', btw 정말 첫 번째 CTE가 필요 없다고 생각합니다. – TomT