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

问题描述 投票:1回答:1

有表列如下

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

应该是结果。任何组合都可以与group by一起使用?

sql-server datediff
1个回答
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在数学之前用数据实现。

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

© www.soinside.com 2019 - 2024. All rights reserved.