簡體   English   中英

SQL Server 2008:如何對計算的別名列使用子查詢/ CTE

[英]SQL Server 2008 : how to use Subquery/CTE for calculated alias columns

我正在嘗試建立一個查詢,該查詢基本上占用了工作的打卡時間,並使用DATEADDTotalTime列來計算打卡時間。

我正在嘗試使用ClockOutTime別名和TotalTime別名。 由於它們是別名,因此我無法在進一步的計算中使用它們,這使我相信我可能需要將其重新格式化為子查詢或cte,但是我不是SQL專家,並且嘗試獲取失敗這個工作。

如果有人能幫助我指出正確的方向,我將不勝感激。

謝謝!

SELECT DISTINCT
    wol.Work_Order_KEY AS WorkOrderKey,
    Contact_Name AS Employee,
    Labor_Date,
    CONVERT(VARCHAR(5), Labor_Date, 108) AS ClockOutTime,
    REPLACE(CAST(CONVERT(DECIMAL(10, 2), CAST(Hours AS INT) + ((Hours-
    CAST(Hours AS INT)) * .60)) AS VARCHAR), '.', ':') AS TotalTime,
    wol.Asset_ID AS AssetID, 
    al.Group_ID AS GroupID
FROM 
    WorkOrderContacts woc,
    WorkOrderLaborList woll 
JOIN
    WorkOrderList wol ON wol.Work_Order_KEY = woll.Work_Order_KEY 
JOIN
    AssetList al ON wol.Asset_ID = al.Asset_ID

您將需要創建一個外部查詢並在其中使用別名。

select * from (select 
    distinct wol.Work_Order_KEY as WorkOrderKey
    ,Contact_Name as Employee
    ,Labor_Date
    ,CONVERT(VARCHAR(5),Labor_Date,108) as ClockOutTime
    ,replace(cast(convert(decimal(10,2),cast(Hours as int)+((Hours-
    cast(Hours as 
    int))*.60)) as varchar),'.',':') as TotalTime
    ,wol.Asset_ID as AssetID
    ,al.Group_ID as GroupID

FROM 
    WorkOrderContacts woc,
    WorkOrderLaborList woll join 
    WorkOrderList wol on wol.Work_Order_KEY=woll.Work_Order_KEY join 
    AssetList al on wol.Asset_ID=al.Asset_ID) as temp 
    where TotalTime = 'your value'

您對TotalTime的計算對我來說有點懷疑(請參閱下面的sql中的注釋)。 交叉連接可能是適當的,但是通常不需要交叉連接。 我試圖做一些格式化來幫助這里。 我還更改了所有內容以使用convert。 如果您使用一個或另一個,這並不重要,但我希望單個查詢保持一致。 而且,不是小時名稱列的忠實擁護者,因為這是t-sql中的保留字,但仍可管理。 我在代碼中使用了cte,但是您不必這樣做。 您可以像此處的其他答案一樣創建派生表,也可以重復整個計算(但這有點丑陋)。

with MyCTE as
(
    select 
        distinct wol.Work_Order_KEY as WorkOrderKey
        , Contact_Name as Employee
        , Labor_Date
        , CONVERT(VARCHAR(5),Labor_Date,108) as ClockOutTime
        , replace(convert(varchar(10), convert(decimal(10,2), convert(int, Hours) + ((Hours - convert(int, Hours)) * .60))), '.', ':') as TotalTime --should this be dividing by 60 instead of multiplying?
        , wol.Asset_ID as AssetID
        , al.Group_ID as GroupID
    FROM WorkOrderContacts woc
    cross join WorkOrderLaborList woll --do you really want a cross join here or is there an appropriate inner/outer join to be made?
    join WorkOrderList wol on wol.Work_Order_KEY = woll.Work_Order_KEY 
    join AssetList al on wol.Asset_ID = al.Asset_ID
)
select *
from MyCTE
where TotalTime = 'ValueYouAreSearchingFor'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM