SQL选择具有DateDiff SUM和Math运算的语句

时间:2014-08-18 14:06:06

标签: sql-server datediff

具有以下表格列

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条记录。对于第一个记录, 当前行天差异/今天应该是结果。 即

  1. 10/17
  2. 5/17
  3. 2/17
  4. 应该是结果。任何组合都可以与group by?

    一起使用

1 个答案:

答案 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在数学之前用数据实现。

在内联查询的情况下,操作的顺序是内部的,因此它计算子表,然后执行查询。

相关问题