Estou tentando adicionar a saída de uma coluna derivada de uma instrução CASE ([Gift Aid Total] a uma coluna da tabela padrão (bd.pagamento). Neste caso, a coluna derivada é igual a um valor monetário e eu quero adicioná-la a outro valor monetário em uma tabela.
Tentei o código SQL padrão (veja abaixo) para adicionar as duas colunas juntas.
select co.contacttype, co.firstname+' '+co.keyname [Name], bd.incometype, bd.paymentamount,
CASE WHEN (gd.GADstatus)='Active' THEN bd.paymentamount*0.25
ELSE '0'
END AS [GAT],
[GAT]+bd.paymentamount,
bd.dateofpayment [Payment Date]
from contact co
left join batchdetail bd on co.serialnumber=bd.serialnumber
left join GIFTAID_CURRENTDECLARATION AS gd ON bd.SERIALNUMBER=gd.SERIALNUMBER
where bd.DATEOFPAYMENT BETWEEN '2016-09-01' AND '2019-08-31'
Quando tento adicionar essas duas colunas, recebo uma mensagem de erro dizendo Nome de coluna inválido 'GAT'.
Gostaria que o código somasse as duas colunas e mostrasse o total em uma nova terceira coluna.
Instruções SQL não pode se referir a um alias definido no SELECT
na mesma consulta de SELECT
, FROM
ou WHERE
cláusulas (e outros, dependendo do banco de dados). Pois o SELECT
motivo é simples: o SQL não garante a ordem de avaliação das expressões.
Isso costumava ser resolvido usando CTEs ou subconsultas. Meu método preferido é uma junção lateral. A sintaxe depende do banco de dados. No SQL Server, é assim:
select co.contacttype, (co.firstname + ' ' + co.keyname) as [Name],
bd.incometype, bd.paymentamount, v.gat,
v.gat + bd.paymentamount,
bd.dateofpayment as [Payment Date]
from contact co left join
batchdetail bd
on co.serialnumber = bd.serialnumber left join
GIFTAID_CURRENTDECLARATION gd
on bd.SERIALNUMBER = gd.SERIALNUMBER cross apply
(values (CASE WHEN gd.GADstatus ='Active' THEN bd.paymentamount * 0.25
ELSE 0 END)
) v(gat)
where bd.DATEOFPAYMENT BETWEEN '2016-09-01' AND '2019-08-31'
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras