Sql 在分组中使用别名
我知道您不能在group by中使用别名,因为它是在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],
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