在SQL中使用相同的输出两次时,如何避免函数的重复?
我正在玩Microsoft SQL Server为了熟悉软件和学习SQL。我正在使用一个样本数据库,其中包含有关公司雇员的信息。在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岁以上的今天,也显示他们的年龄在'年龄'栏。
我曾尝试以下:
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;
你必须要使用它,每次重复功能... 我想这是你想要做什么。正确吗?
我上面提到的代码工作正常(尽管它不像它应该那样准确,正如@Damien_The_Unbeliever先前指出的那样),但我只是想知道是否有一种不使用DATEDIFF()两次的方法。 – ilomax
我认为你的模式信息不正确。 尝试删除[AdventureWorks2014] [人力资源]只有放[雇员]
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;
你是什么意思? '[AdventureWorks2014]'是完整的数据库,'[HumanResources]。[Employee]'是表格。数据库中没有“[Employee]'唯一”表。 – ilomax
'DATEDIFF'不会做你的描述。如果你想找到超过40岁的人,截至今天,你最好从今天减去40年,并将其与DOB列进行比较。 (提示'DATEDIFF(year,'20011231','20020101')'returns'1') –
查询的结果是什么?你有错误吗? –
@CoskunOzogul我得到错误:'消息156,级别15,状态1,行13 'AS'附近的语法不正确(注意:我已经在原始文章中编辑过该行,括号没有正确定位) – ilomax