2017-08-02 69 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

相關問題