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

SQL Server 2008:如何对计算的别名列使用子查询/CTE,sql,sql-server,sql-server-2008,alias,calculated-field,Sql,Sql Server,Sql Server 2008,Alias,Calculated Field,我有一个查询,我正在尝试构建它,它基本上会占用一个作业的打卡时间,并使用DATEADD和TotalTime列来计算打卡时间 我要做的是使用ClockOutTime别名和TotalTime别名。由于它们是别名,我无法在进一步的计算中使用它们,这让我相信我可能需要将其重新格式化为子查询或cte,但是我不是SQL专家,并且尝试使其工作失败 如果有人能帮我指出正确的方向,我将非常感激 谢谢 SELECT DISTINCT wol.Work_Order_KEY AS WorkOrderKey,

我有一个查询,我正在尝试构建它,它基本上会占用一个作业的打卡时间,并使用
DATEADD
TotalTime
列来计算打卡时间

我要做的是使用
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'

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

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中的注释)。交叉连接可能是合适的,但通常不需要交叉连接。我试图做一些格式化来帮助这里。我还改变了一切使用转换。使用其中一个并不重要,但我更希望单个查询保持一致。此外,不太喜欢名为Hours的列,因为这是t-sql中的保留字,但它仍然是可管理的。我在代码中使用了cte,但您不必这样做。您可以像这里的另一个答案一样创建一个派生表,也可以重复整个计算(但这有点难看)


我觉得您对TotalTime的计算有点可疑(请参阅下面sql中的注释)。交叉连接可能是合适的,但通常不需要交叉连接。我试图做一些格式化来帮助这里。我还改变了一切使用转换。使用其中一个并不重要,但我更希望单个查询保持一致。此外,不太喜欢名为Hours的列,因为这是t-sql中的保留字,但它仍然是可管理的。我在代码中使用了cte,但您不必这样做。您可以像这里的另一个答案一样创建一个派生表,也可以重复整个计算(但这有点难看)


在你继续之前,你需要把这个清理干净。前两个表是隐式交叉连接,这不是一个好习惯。您也正在转换为varchar,但没有指定大小,这也是一个坏习惯。你正在混合转换和铸造。这本身不是一个问题,但在同一个查询中看到这两种方法都能实现肯定会让人困惑。感谢您提供的建设性帮助!正如我所说,我不是SQL方面的专家,所以说实话,我很惊讶我能做到这一点,哈哈。如果你对如何清理这个问题有任何建议,我将非常感激。我不知道我这里有多少坏习惯/坏习惯,但我并不感到惊讶。在你继续之前,你需要清理一下。前两个表是隐式交叉连接,这不是一个好习惯。您也正在转换为varchar,但没有指定大小,这也是一个坏习惯。你正在混合转换和铸造。这本身不是一个问题,但在同一个查询中看到这两种方法都能实现肯定会让人困惑。感谢您提供的建设性帮助!正如我所说,我不是SQL方面的专家,所以说实话,我很惊讶我能做到这一点,哈哈。如果你对如何清理这个问题有任何建议,我将非常感激。我不知道这里有多少坏习惯/坏形式,但我并不感到惊讶。有一些格式,所以这是易读的,这将是一个非常可靠的答案。有一些格式,所以这是易读的,这将是一个非常可靠的答案。先生,您是一位绅士和学者,我感谢您的建议和代码方面的帮助。我会试试看,然后再报告!先生,您是一位绅士和学者,我感谢您对代码的建议和帮助。我会试试看,然后再报告!