具有以下表格列
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?
一起使用答案 0 :(得分:3)
问题是操作的范围/顺序之一。在您想要进行%计算时,总和不可用。因此,您首先必须生成总和,然后才能获得%。
这可以使用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在数学之前用数据实现。
在内联查询的情况下,操作的顺序是内部的,因此它计算子表,然后执行查询。