将派生自CASE函数的列添加到普通表列

时间:2019-05-15 15:32:11

标签: sql

我正在尝试将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”。

我希望代码将两列加在一起,并在新的第三列中显示总数。

2 个答案:

答案 0 :(得分:0)

SQL语句不能引用在同一查询的SELECTSELECTFROM子句(以及其他取决于数据库的子句)的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

SQL DEMO