我正在尝试将CASE语句([Gift Aid Total]派生的列)的输出添加到标准表列(bd.paymentamount)中。在这种情况下,派生列等于货币值,我想将其添加到表中的另一个货币值。
我已经尝试过使用标准SQL代码(见下文)将这两列加在一起。
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'
当我尝试将这两列加在一起时,我收到一条错误消息,指出无效的列名“ GAT”。
我希望代码将两列加在一起,并在新的第三列中显示总数。
答案 0 :(得分:0)
SQL语句不能引用在同一查询的SELECT
,SELECT
或FROM
子句(以及其他取决于数据库的子句)的WHERE
中定义的别名。对于SELECT
,原因很简单:SQL不保证表达式的求值顺序。
过去,这是使用CTE或子查询解决的。我的首选方法是横向连接。语法取决于数据库。在SQL Server中,它看起来像这样:
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'
答案 1 :(得分:0)
您不能在同一级别使用别名,因为所有字段都在同一时间处理,并且此时别名仍然不存在
这是错误的
SELECT 1 as one, one + one as two
相反,您首先需要创建别名,然后在子查询中使用
SELECT one + one as two
FROM ( SELECT 1 as one ) as t