2017-08-09 21 views
-3

我有一个针对SUM方程的具有多个别名的查询。来自别名的SQL方程

现在我需要在更大的公式中使用这些别名,但显然不能在同一个查询中使用别名。在一个案例中,我总共需要将大约7个别名相加,再将两个别名相加在一起。有没有简单的方法来做到这一点?使用SQL Server

例如 -

ISNULL((SELECT SUM(Addendums) 
     FROM v_Addendums 
     WHERE Job_ID = JM.Job_ID 
       AND (JC.FundingType_ID <> 1 OR JC.FundingType_ID IS NULL) 
       AND jobPhase_CompletedDate <= @dt1 
       AND (Addendum_Date between @dt1-31 and @dt1)),0) AS Earn30, 

ISNULL((SELECT SUM(JM1.Draw_Amount) 
     FROM DrawSchedule AS JM1 INNER JOIN 
      JobContracts AS JC1 ON JM1.Job_ID = JC1.Job_ID LEFT OUTER JOIN 
      v_JobPhase ON JC1.Job_ID = v_JobPhase.Job_ID AND 
      JM1.JobPhase_ID = v_JobPhase.PhaseType_ID 
     WHERE (v_JobPhase.Completed IS NOT NULL) 
      AND (JC.FundingType_ID <> 1 OR JC.FundingType_ID IS NULL) 
      AND (v_JobPhase.Completed BETWEEN @dt1 - 61 AND @dt1-31) 
      AND (JM1.Job_ID = JM.Job_ID)),0) + 
ISNULL((SELECT SUM(Addendums) 
     FROM v_Addendums 
     WHERE Job_ID = JM.Job_ID 
      AND (JC.FundingType_ID <> 1 OR JC.FundingType_ID IS NULL) 
      AND jobPhase_CompletedDate <= @dt1 
      AND (Addendum_Date between @dt1-61 and @dt1-31)),0) AS Earn60 

说我需要添加Earn30 + Earn60 ..然后减去另一个类似的别名。

+1

您需要发布您的代码以便能够直接评论您的解决方案。但是,有些方法会取决于您使用的RDBMS,因此您应该对其进行标记(例如,sql-server,oracle等)。很可能您希望在公用表表达式中创建所有总和[cte]或派生表,然后引用你的最后等式的别名列 – Matt

+0

@Matt谢谢,我将你的建议添加到我的问题。 –

+0

在公共表表达式[CTE]上阅读起来,它可能会比起派生表更容易理解,因为您可以更轻松地分离您的逻辑。也没有看到你所有的查询,我只能说第一眼看上去有一些其他写这个查询的方法,你可能会从中获益。也不要使事情复杂化,但如果你真的只处理1行/一组值,你也可以将这些部分分配给变量。 – Matt

回答

0

您可以使用SQL Server的CTE表(通用表表达式)执行此操作。 例如

;with mycte as (
select 1 as line1 -- this is your statement with whatever and assigning it an alias 
) 

select 
line1 -- this is your alias column from the previous mycte 
, line1+1 as line2 -- just an example of playing with the alias 
from mycte