在 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;
我正在玩 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;