2017-08-02 68 views
-1

我正在玩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外面,但我找不到此刻另一种解决方案。

在此先感谢那些能够启发我的人。

+0

'DATEDIFF'不会做你的描述。如果你想找到超过40岁的人,截至今天,你最好从今天减去40年,并将其与DOB列进行比较。 (提示'DATEDIFF(year,'20011231','20020101')'returns'1') –

+0

查询的结果是什么?你有错误吗? –

+0

@CoskunOzogul我得到错误:'消息156,级别15,状态1,行13 'AS'附近的语法不正确(注意:我已经在原始文章中编辑过该行,括号没有正确定位) – ilomax

回答

1

您可以使用几个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计数过渡

0

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; 

你必须要使用它,每次重复功能... 我想这是你想要做什么。正确吗?

+0

我上面提到的代码工作正常(尽管它不像它应该那样准确,正如@Damien_The_Unbeliever先前指出的那样),但我只是想知道是否有一种不使用DATEDIFF()两次的方法。 – ilomax

-1

我认为你的模式信息不正确。 尝试删除[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; 
+0

你是什么意思? '[AdventureWorks2014]'是完整的数据库,'[HumanResources]。[Employee]'是表格。数据库中没有“[Employee]'唯一”表。 – ilomax

相关问题