Sql 在分组中使用别名

Sql 在分组中使用别名,sql,sql-server-2008,join,group-by,alias,Sql,Sql Server 2008,Join,Group By,Alias,我知道您不能在group by中使用别名,因为它是在SELECT语句之前处理的。但是,如果我将原始的SELECT语句嵌套在子查询中,是否会影响性能 至少对我来说,它让阅读变得更容易,但我更关心性能 我最初的问题是: SELECT Rec.Description [CO_Desc], EM.Description [EM_Desc], ISNULL(EM.UnitCost, '0') * DPaCT.ProcedureProjection [Proj_Cost],

我知道您不能在group by中使用别名,因为它是在
SELECT
语句之前处理的。但是,如果我将原始的
SELECT
语句嵌套在子查询中,是否会影响性能

至少对我来说,它让阅读变得更容易,但我更关心性能

我最初的问题是:

SELECT 
    Rec.Description [CO_Desc], 
    EM.Description [EM_Desc], 
    ISNULL(EM.UnitCost, '0') * DPaCT.ProcedureProjection [Proj_Cost],     
    ISNULL(EM.UnitCost, '0') * DPaCt.ProceduresPerformed [Act_Cost]
FROM 
    rpt_DriveMaster DM
LEFT OUTER JOIN
    rpt_Accounts Acct ON DM.AccountID = Acct.AccountID
LEFT OUTER JOIN 
    IDViewRecruiters Rec ON Acct.RecruiterID = Rec.CodeID
INNER JOIN 
    rpt_CenterDetail CD ON DM.CenterID = CD.CenterID
INNER JOIN 
    IDViewCollectionOp CO ON CD.CenterID = CO.CodeID
INNER JOIN 
    IDViewRegion Reg ON CD.Region = Reg.CodeID
INNER JOIN 
    IDViewOrgCenter Org ON CD.OrgCenter = Org.CodeID
INNER JOIN 
    IDViewOrgSubCenter Sub ON CD.OrgSubCenter = Sub.CodeID
INNER JOIN 
    rpt_DriveStatusDef DrStat ON DM.StatusID = DrStat.StatusID
INNER JOIN 
    DriveProjectionandCollectedTotals DPaCT ON DM.DriveID = DPaCT.DriveID
LEFT OUTER JOIN 
    EquipmentDetail ED ON DM.DriveID = ED.DriveID
LEFT OUTER JOIN 
    EquipmentMaster EM ON ED.EquipmentId = EM.EquipmentID
WHERE 
    DM.StatusID <> 5 AND 
    DM.FromDateTime BETWEEN '02/01/2014' AND '02/28/2014' AND
    CO.CodeID IN (106,107,108,110)
GROUP BY 
    Rec.Description, 
    EM.Description, 
    ISNULL(EM.UnitCost, '0') * DPaCT.ProcedureProjection,  
    ISNULL(EM.UnitCost, '0') * DPaCt.ProceduresPerformed

我是否看到了查询性能的真正差异?

为什么首先需要
groupby
?您的查询中没有聚合。您可以对相同的结果使用
SELECT DISTINCT
,顺便说一句,您的
ISNULL
可能会返回一个字符。SQL Server将为您将其转换为int,但这是一种糟糕的形式。谢谢Zoff,我实际上正在计算sum(),但忘记在我的原始帖子中包含它。这是糟糕的形式。我更改了ISNULL以删除0周围的“”。比较执行计划,这会给您一个指示
SELECT 
    A.Rec_Desc, 
    A.EM_Desc, 
    A.Proj_Cost, 
    A.Act_Cost
FROM
(
    SELECT
        Rec.Description [Rec_Desc], 
        EM.Description [EM_Desc],
        ISNULL(EM.UnitCost, '0') * DPaCT.ProcedureProjection [Proj_Cost], 
        ISNULL(EM.UnitCost, '0')  *DPaCt.ProceduresPerformed [Act_Cost]
    FROM 
        rpt_DriveMaster DM
    LEFT OUTER JOIN 
        rpt_Accounts Acct ON DM.AccountID = Acct.AccountID
    LEFT OUTER JOIN 
        IDViewRecruiters Rec ON Acct.RecruiterID = Rec.CodeID
    INNER JOIN 
        rpt_CenterDetail CD ON DM.CenterID = CD.CenterID
    INNER JOIN 
        IDViewCollectionOp CO ON CD.CenterID = CO.CodeID
    INNER JOIN 
        IDViewRegion Reg ON CD.Region = Reg.CodeID
    INNER JOIN 
        IDViewOrgCenter Org ON CD.OrgCenter = Org.CodeID
    INNER JOIN 
        IDViewOrgSubCenter Sub ON CD.OrgSubCenter = Sub.CodeID
    INNER JOIN 
        rpt_DriveStatusDef DrStat ON DM.StatusID = DrStat.StatusID
    INNER JOIN 
        DriveProjectionandCollectedTotals DPaCT ON DM.DriveID = DPaCT.DriveID
    LEFT OUTER JOIN 
        EquipmentDetail ED ON DM.DriveID = ED.DriveID
    LEFT OUTER JOIN 
        EquipmentMaster EM ON ED.EquipmentId = EM.EquipmentID
    WHERE
        DM.StatusID <> 5 AND 
        DM.FromDateTime BETWEEN '02/01/2014' AND '02/28/2014' AND
        CO.CodeID IN (106,107,108,110)) AS A
    GROUP BY 
        A.Rec_Desc, 
        A.EM_Desc, 
        A.Proj_Cost, 
        A.Act_Cost