SQL Server - 优化窗口函数没有重复代码?

时间:2017-07-06 13:38:24

标签: sql sql-server tsql

我有一张桌子,我想要进行一些计算。该表存储为执行各种任务而获得的员工积分。相关结构如下(表格大约有15,000行):

PointsTable:

  ID int IDENTITY(1, 1),
  EmployeeFirstName (varchar),
  EmployeeLastName (varchar),
  PointsAwarded (decimal(18, 2)),
  TransactionDate (date)

对于每一行,我想返回以下内容:

Employee Name
Points Awarded
Transaction Date
Employee's Running Total (cumulative sum for that one employee)
Employee's Total Points (sum of all points for that one employee)
Running Total (cumulative sum for all employees)
Total Points (sum of all points for all employees)
Employee's Running Percentage (Employee's Running Total / Employee's Total Points)
Employees' Total Percentage (Employee's Total Points / Total Points)
Total Running Percentage (Running Total / Total Points)

以下是我目前使用的查询:

SELECT  EmployeeFirstName + ' ' + EmployeeLastName AS [Employee], 
        PointsAwarded, 
        TransactionDate, 
        [Employee Running Total], 
        [Employee Running Total] / [Employee Total Points] AS [Employee Running Percentage],
        [Employee Total Points],
        [Employee Total Points] / [Total Points] AS [Employee Total Percentage],
        [Running Total Points], 
        [Running Total Points] / [Total Points] AS [Total Running Percentage],
        [Total Points]
FROM 
    (
    SELECT  EmployeeFirstName, 
            EmployeeLastName, 
            PointsAwarded, 
            TransactionDate,
            SUM(PointsAwarded) OVER (PARTITION BY EmployeeFirstName, EmployeeLastName ORDER BY ID) AS [Employee Running Total],
            SUM(PointsAwarded) OVER (PARTITION BY EmployeeFirstName, EmployeeLastName) AS [Employee Total Points],
            SUM(PointsAwarded) OVER(ORDER BY ID) AS [Running Total Points],
            SUM(PointsAwarded) OVER() AS [Total Points]
    FROM PointsTable
    ) t

此查询有效,并按预期返回结果。但是,我觉得它可以优化。是否可以在子查询中包含计算,而无需重复代码?

例如,此代码是提供员工运行百分比所必需的:

SUM(PointsAwarded) OVER (PARTITION BY EmployeeFirstName, EmployeeLastName ORDER BY ID) / 
SUM(PointsAwarded) OVER (PARTITION BY EmployeeFirstName, EmployeeLastName)

有没有办法用窗口来实现这一点 - 没有多次重复OVER功能?到目前为止,我能够实现这一目标的唯一方式就是我发布的方式。我认为CTE会或多或少相同,但我不是专家。

提前感谢您的帮助 - 如果我能以任何方式澄清,请告诉我。

0 个答案:

没有答案