在 SQL 中两次使用相同的输出时,如何避免重复函数?

How can I avoid repetition of a function when using the same output twice in SQL?

我正在玩 Microsoft SQL Server 以熟悉该软件并学习 SQL。我正在使用一个示例数据库,其中包含有关公司员工的信息。

这是我目前正在使用的代码:

SELECT [LoginID]
      ,[OrganizationLevel]
      ,[JobTitle]
      ,[BirthDate]
      ,[MaritalStatus]
      ,[Gender]
      ,[HireDate]
      ,[VacationHours]
      ,[SickLeaveHours]
      ,DateDiff(Year, BirthDate, GetDate()) AS 'Age'
  FROM [AdventureWorks2014].[HumanResources].[Employee]
  WHERE MaritalStatus = 'M' AND (DateDiff(Year, BirthDate, GetDate()) > 40)
  ORDER BY Gender, Age ASC;

如您所见,我只想显示截至今天40岁以上的已婚员工,但还要在'Age'列中显示他们的年龄。

我试过以下方法:

WHERE MaritalStatus = 'M' AND ((DateDiff(Year, BirthDate, GetDate())) AS 'Age') > 40

为了避免使用DATEDIFF()函数两次但不成功

我想这与

有关
DateDiff(Year, BirthDate, GetDate()) AS 'Age'

SELECT 之外,但我目前找不到其他解决方案。

在此先感谢那些能够赐教的人。

您可以使用几个 APPLY 来计算实际年龄并减少重复,但请注意系统应该已经对此进行了优化。

SELECT [LoginID]
      ,[OrganizationLevel]
      ,[JobTitle]
      ,[BirthDate]
      ,[MaritalStatus]
      ,[Gender]
      ,[HireDate]
      ,[VacationHours]
      ,[SickLeaveHours]
      ,Age
  FROM [AdventureWorks2014].[HumanResources].[Employee]
  CROSS APPLY (SELECT DATEDIFF(year,BurthDate,GetDate()) as PotentialAge) a
  CROSS APPLY (SELECT CASE WHEN DATEADD(year,PotentialAge,BirthDate) > GetDate() 
               THEN PotentialAge - 1 ELSE PotentialAge END as Age) b
  WHERE MaritalStatus = 'M' AND Age > 40
  ORDER BY Gender, Age ASC;

正如评论中指出的那样,我们必须做更多的工作来生成实际年龄,因为 DATEDIFF 计数 转换

AS语句只能在Select语句中。

SELECT [LoginID]
  ,[OrganizationLevel]
  ,[JobTitle]
  ,[BirthDate]
  ,[MaritalStatus]
  ,[Gender]
  ,[HireDate]
  ,[VacationHours]
  ,[SickLeaveHours]
  ,DateDiff(Year, BirthDate, GetDate()) AS 'Age'
  FROM [AdventureWorks2014].[HumanResources].[Employee]
  WHERE MaritalStatus = 'M' AND (DateDiff(Year, BirthDate, GetDate()) > 40)
  ORDER BY Gender, DateDiff(Year, BirthDate, GetDate()) ASC;

每次要使用该功能都必须重复... 我想这就是你想要做的。正确吗?

我认为您的架构信息不正确。 尝试删除 [AdventureWorks2014].[HumanResources] 并仅放置 [Employee]

  SELECT [LoginID]
  ,[OrganizationLevel]
  ,[JobTitle]
  ,[BirthDate]
  ,[MaritalStatus]
  ,[Gender]
  ,[HireDate]
  ,[VacationHours]
  ,[SickLeaveHours]
  ,DateDiff(Year, BirthDate, GetDate()) AS 'Age'
 FROM Employee]
 WHERE MaritalStatus = 'M' AND (DateDiff(Year, BirthDate, GetDate()) > 40)
 ORDER BY Gender, Age ASC;