SQL Server 2008:如何将子查询/ CTE用于计算的别名列

时间:2017-09-12 18:59:30

标签: sql sql-server sql-server-2008 alias calculated-field

我有一个查询,我正在尝试构建,这基本上需要一个工作的打卡时间,并使用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

2 个答案:

答案 0 :(得分:0)

你需要创建一个外部查询并在那里使用别名。

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'

答案 1 :(得分:0)

你对TotalTime的计算看起来有点让我怀疑(参见我在下面的sql中的评论)。交叉连接可能是合适的,但通常不需要交叉连接。我尝试做一些格式化来帮助这里。我也改变了一切使用转换。如果你使用一个或另一个并不重要,但我更喜欢单个查询保持一致。此外,不是名为Hours的列的巨大粉丝,因为这是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'