我一直在尝试减去 sql server 中的两列以形成第三列。以下是我的查询
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
最佳答案
您无需使用 CTE,即可通过重复构成 AlownedToDate 的整个公式来完成此操作。
您不能在 SELECT 列表中使用列的别名,因此您不能执行以下操作:
SELECT {some calculation} AS ColumnA, (ColumnA - ColumnB) AS ColumnC
如果您不想使用 CTE 或派生表,则必须执行以下操作:
SELECT {some calculation} AS ColumnA, ({some calculation} - ColumnB) AS ColumnC
顺便说一句,我无法想象为什么 future 添加列的可能性是不使用 CTE 的原因。对我来说,这听起来像是使用 CTE 的一个原因,因为您只需在代码中的一个位置进行更改,而不必在同一查询中的不同位置重复相同的代码。
关于sql-server - 在 SQL 查询中减去两列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37028278/