【发布时间】:2014-05-11 09:50:32
【问题描述】:
我正在尝试创建一个脚本来计算存储过程的预期结果。有几个与 sp 相关的表共享一个 BatchId。 x_NonFullTimeEmployees 有一个 StatusString 列,其长度等于 MeasurementStartDate 和 MeasurementStartDate 之间的时间段。 IE。在 7 天的时间里,它可能看起来像 'TAAAAAA'。我正在选择同一时期的时间卡并将它们的值相加。我的问题是我只想使用 TimeCard 值,其中 StartDate 是在 StatusString 中由“A”表示的一天。我该怎么做?
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
【问题讨论】:
标签: sql-server sql-server-2012 substring common-table-expression date-range