2016-05-04 72 views
2

我一直試圖在sql server中減去兩列來形成第三列。以下是我的查詢在sql查詢中減去兩列

select AD.Id, Sum(APS.Amount) AS TotalDue, 
isnull((select sum(Amount) from Activation where InvoiceId in (select InvoiceId from Invoices where AgreementId = AD.Id)),0) 
As AllocatedToDate 
from AdvantageDetails AD 
inner join AllPaymentsSubstantial APS 
on APS.AgreementId=AD.Id 
where AD.OrganizationId=30 
group by AD.Id 

我試過的是以下但它不工作。 :

select AD.Id, Sum(APS.Amount) AS TotalDue, 
isnull((select sum(Amount) from Activation where InvoiceId in (select InvoiceId from Invoices where AgreementId = AD.Id)),0) 
As AllocatedToDate , (TotalDue-AllocatedToDate) as NewColumn 
from AdvantageDetails AD 
inner join AllPaymentsSubstantial APS 
on APS.AgreementId=AD.Id 
where AD.OrganizationId=30 
group by AD.Id 

最後我嘗試了使用CTE工作正常。但是我想在不創建CTE的情況下做到這一點。有沒有其他方式可以執行相同的功能。我不想使用CTE,因爲這是 可以是將來計算的其他列。

with CTE as(select AD.Id, Sum(APS.Amount) AS TotalDue, 
isnull((select sum(Amount) from Activation where InvoiceId in (select InvoiceId from Invoices where AgreementId = AD.Id)),0) 
As AllocatedToDate , (TotalDue-AllocatedToDate) as NewColumn 
from AdvantageDetails AD 
inner join AllPaymentsSubstantial APS 
on APS.AgreementId=AD.Id 
where AD.OrganizationId=30 
group by AD.Id) select * , (CTE.TotalDue-CTE.AllocatedToDate)As Newcolumn from CTE 

回答

3

您可以通過重複構成AllocatedToDate的整個公式來完成,而無需CTE。

你不能使用列的別名在SELECT列表,所以你不能做到這一點:你必須這樣做

SELECT {some calculation} AS ColumnA, (ColumnA - ColumnB) AS ColumnC 

如果你不想使用CTE或派生表:

SELECT {some calculation} AS ColumnA, ({some calculation} - ColumnB) AS ColumnC 

順便說一句,我無法想象爲什麼未來的列被添加的可能性是不使用CTE的原因。對我來說,這聽起來像是使用CTE的原因,因爲您只需在代碼中的一個位置進行更改,並且不會在同一查詢的不同位置複製相同的代碼。

-1

你可以使用嵌套查詢:

select Id, TotalDue, AllocatedToDate, (TotalDue-AllocatedToDate) as NewColumn 
from (
    select AD.Id, Sum(APS.Amount) AS TotalDue, 
     isnull((select sum(Amount) from Activation where InvoiceId in (select InvoiceId from Invoices where AgreementId = AD.Id)),0) 
     As AllocatedToDate 
    from AdvantageDetails AD 
    inner join AllPaymentsSubstantial APS 
     on APS.AgreementId=AD.Id 
    where AD.OrganizationId=30 
    group by AD.Id 
) x 
+0

和downvote的原因是......? – Arvo