有表列如下
Employee Id StartDate EndDate
1 2014-07-01 2014-07-10
1 2014-07-11 2014-07-15
1 2014-07-16 2014-07-17
2 2014-07-18 2014-07-30
在上面的数据中,我想要对员工的整个日期期间求和,并将该日期的贡献百分比作为另一列
SELECT SUM(DATEDIFF(day,StartDate,EndDate)),
DATEDIFF(day,StartDate,EndDate) / SUM(DATEDIFF(day,StartDate,EndDate))
FROM dbo.[abovetable]
WHERE EmployeedId=1
在这里,员工ID 1的总天数是17(10 + 5 + 2)。他下面有3条记录。对于第一个记录,当前行天差异/今天应该是结果。即
应该是结果。任何组合都可以与group by一起使用?
问题是操作的范围/顺序之一。在您想要进行%计算时,总和不可用。因此,您首先必须生成总和,然后您可以获得%。
这可以使用COMMON TABLE EXPRESSION(CTE)或子查询来完成。
这是CTE示例。
WITH CTE AS (SELECT EMPLOYEEID, SUM(DATEDIFF(day,StartDate,EndDate)) as SumDates,
FROM dbo.[abovetable]
GROUP BY EmployeeID)
SELECT EmployeeID, SumDates, DATEDIFF(day,StartDate,EndDate) / SumDates
FROM Employee
INNER JOIN CTE on E.EmployeeID = CTE.EmployeeID
WHERE EmployeedId=1
这是一个内联查询(子查询)示例
SELECT EmployeeID, SumDates, DATEDIFF(day,StartDate,EndDate) / SumDates
FROM Employee
INNER JOIN (SELECT EMPLOYEEID, SUM(DATEDIFF(day,StartDate,EndDate)) AS SumDates,
FROM dbo.[abovetable]
GROUP BY EmployeeID) CTE
ON E.EmployeeID = CTE.EmployeeID
WHERE EmployeedId=1
在这两种情况下,日期的总和是在分割发生之前确定的。在CTE示例中,CTE在数学之前用数据实现。
在内联查询的情况下,操作的顺序是内部的,因此它计算子表,然后执行查询。