2017-08-09 56 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