使用新表一次又一次地使用计算字段

时间:2012-09-27 15:13:52

标签: sql sql-server

我对SQL很新,我不得不使用table.Imagine我们有一个带有字段的表:ID - Name - Val1 - Val2;假设我想添加2个值并将其添加到我的查询结果中。我可以使用子查询轻松完成此操作,例如:

select val1+val2 as valtotal,* from my table.

现在如果我想在valtotal上做更多的处理,我使用派生表,如;

select valtotal*3 as ValMoreCalculated,* from
(select val1+val2 as valtotal,* from my table) AS A

可能会多一点代码??

select ValMoreCalculated/valtotal as ValEvenMoreCalc ,* from 
(select valtotal*3 as ValMoreCalculated,* from
    (select val1+val2 as valtotal,* from my table) AS A)AS B

所以如果我想用ValMoreCalculated进行更多计算,我是否必须通过另一个派生表?例如将其命名为B?有没有更简单的方法在SQL中实现这一点?

PS:我知道标题有点偏,但无法弄清楚它的名字:P

3 个答案:

答案 0 :(得分:2)

你应该能够一举执行计算而不是子计划。

示例:

select (val1+val2)*3 as ValMoreCalculated,* from my table

修改

我认为有必要解决你的评论。例如,如果你想有条件地将3乘以,你就可以这样做:

select (val1+val2)*CASE WHEN <some expression> = 'SomeValue' THEN 3 ELSE 1 END as ValMoreCalculated,* from my table

工作示例:

Declare @val1 int 
Declare @val2 int 
Declare @someExpression int 
Set @val1 = 1 
Set @val2 = 2 
Set @someExpression = 1

select (@val1+@val2)*CASE WHEN @someExpression = 1 THEN 3 ELSE 1 END as ValMoreCalculated

另外,要解决您的问题编辑:

select ((val1+val2)*3)/(val1+val2) as ValEvenMoreCalc,* from my table

关键是如果你的计算是一对一的记录,则不需要子查询。例如,如果您想要任何分组,那么 可能 。如果subquerying让你更具可读性,那么这只是一个偏好问题。为清楚起见,我倾向于使用评论。你不能比那更清楚:

--Calculates x based on y to get a gross profit %
select ((val1+val2)*3)/(val1+val2) as ValEvenMoreCalc,* from my table

答案 1 :(得分:1)

您的样本可以简化为不使用计算,但如果您确实需要在多个地方重复使用一些复杂的计算,则可以使用cross apply。它仍在进行查询,但看起来有点不同。

select T3.ValMoreCalculated/T2.Valtotal as ValEvenMoreCalc, *
from YourTable as T1
  cross apply (select T1.Val1 + T1.Val2) as T2(ValTotal)
  cross apply (select T2.ValTotal * 3) as T3(ValMoreCalculated)

答案 2 :(得分:0)

您的问题的答案是,如果您想要所有中间结果,则需要子查询。

SQL的大多数方言都不允许您在定义它的同一select语句中使用列别名。

您可以开始创建复杂的表达式。但是,我发现子查询比不必要的复杂语句更清晰,更易于维护。

我想添加两件事。首先,在这种情况下使用子查询没有性能损失。如果这是您的问题,则只读取一次数据。

其次,您可能对表上的计算列感兴趣。这是一个SQL Server功能,允许您定义从表中的其他列派生的新列。因此,valTotal可以作为表达式存储在表中,而不占用任何数据空间。