0

我对 SQL 很陌生,我不得不使用表进行一些计算。想象一下我们有一个包含字段的表: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

4

3 回答 3

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

关键是如果您的计算是与记录一对一的,则不需要子查询。例如,如果您想要任何分组,那么您可以. 如果子查询使您更容易阅读,那么这只是一个偏好问题。为了清楚起见,我倾向于使用注释。你再清楚不过了:

--Calculates x based on y to get a gross profit %
select ((val1+val2)*3)/(val1+val2) as ValEvenMoreCalc,* from my table
于 2012-09-27T15:16:50.467 回答
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)
于 2012-09-27T16:05:44.070 回答
0

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

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

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

我想补充两点。首先,在这种情况下使用子查询不会影响性能。如果这是您的问题,则数据只读取一次。

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

于 2012-09-27T15:36:22.897 回答