SQL:在查询的其他部分中引用计算列
我希望在SQL Server 2012中执行以下操作:SQL:在查询的其他部分中引用计算列,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我希望在SQL Server 2012中执行以下操作: SELECT UnitPrice * Quantity as SubTotal, SubTotal * (1-0.13) as Tax, Tax + SubTotal as Total FROM Invoice 据我所知,这不可能像上面所写的那样,但是我想知道是否有一种特殊的方法可以动态地标识列,该列可以在查询的其他地方引用,例如“字段列表”(SELECT子句的一部分),作为WHERE子句的一部分或ORDER
SELECT UnitPrice * Quantity as SubTotal,
SubTotal * (1-0.13) as Tax,
Tax + SubTotal as Total
FROM Invoice
据我所知,这不可能像上面所写的那样,但是我想知道是否有一种特殊的方法可以动态地标识列,该列可以在查询的其他地方引用,例如“字段列表”(SELECT子句的一部分),作为WHERE子句的一部分或ORDER BY子句
任何帮助都将不胜感激。部分解决方案(但在许多情况下已足够)是带构造:
with Query as (
select SubTotal as SubTotal,
SubTotal * (1 - 0.13) as Tax,
SubTotal * (1 - 0.15) as AnotherTax -- etc.
from Invoice
)
select SubTotal,
Tax,
Tax + SubTotal as Total
from Query
您可以在交叉应用中进行计算
select T1.SubTotal,
T2.Tax,
T2.Tax + T1.SubTotal as Total
from Invoice as I
cross apply (select I.UnitPrice * I.Quantity) as T1(SubTotal)
cross apply (select T1.SubTotal * (1 - 0.13)) as T2(Tax)
别名是查询执行的最后一部分,在
order by
之前。因此,您只能在order by
子句中引用别名。很好的建议,它可以用于多个计算列吗?在上面的示例中,它只是税务,但如果有其他计算字段(如“单价”和“数量”)来计算“小计”,然后将税务计算添加到组合中,该怎么办。如果有帮助的话,我可以更新我的问题。@sam360:是的,你可以根据需要放置任意多的列。谢谢,我更新了我的问题。您的回答似乎是可行的,但是在我的要求中有更复杂的例子,其中计算列可以相互引用。@sam360:这就是为什么我将其称为“部分解决方案”;如果有复杂的示例,我宁愿创建一个包含所有计算字段的视图,并使用此视图而不是原始发票表谢谢,我非常感谢您的帮助!我认为CROSS APPLY可以更好地处理它,尽管它的性能可能与您的不一样。在某些情况下,我会投票赞成你的答案。。。