2016-05-04 3 views
2

Я пытаюсь вычесть два столбца в sql-сервере, чтобы сформировать третий. Ниже мой запросВычитание двух столбцов в запросе 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

Вы можете сделать это без CTE, повторив всю формулу, которая составляет AllocatedToDate.

Вы не можете использовать псевдоним столбца в списке выбора, так что вы не можете сделать это:

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

Если вы не хотите использовать КТР или производную таблицу, вы должны сделать это:

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

Смежные вопросы