Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:在查询的其他部分中引用计算列_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

SQL:在查询的其他部分中引用计算列

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

我希望在SQL Server 2012中执行以下操作:

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可以更好地处理它,尽管它的性能可能与您的不一样。在某些情况下,我会投票赞成你的答案。。。