防止在SQL Server中重复表达?

时间:2012-03-05 08:34:26

标签: sql-server sql-server-2005

我有这个问题:

SELECT ..... ,( CAST(col1 AS MONEY) / CAST (col2 AS MONEY) ) as calc1 from mytable...

(返回1000行)

现在我需要根据calc1表达式添加更多列(例如calc2 = calc1 * 4

我不想这样做:

SELECT (CAST(col1 AS MONEY) / CAST(col2 AS MONEY)) AS calc1,    --same 
       (CAST(col1 AS MONEY) / CAST(col2 AS MONEY)) * 4 AS calc2,    -- dragged calc1 
       ((CAST(col1 AS MONEY) / CAST(col2 AS MONEY)) * 4) * 50 AS calc2, -- dragged calc2 
       (((CAST(col1 AS MONEY) / CAST(col2 AS MONEY)) * 4) * 50) * 60 AS calc2 -- dragged calc3 

可视化:黄色部分通过添加计算重复自身......

enter image description here

这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:2)

您可以使用公用表表达式(CTE):

;with calcCTE
AS
(
  SELECT (CAST(col1 AS MONEY) / CAST(col2 AS MONEY)) AS calc1
  FROM <table>
)
SELECT calc1,
       calc1 * 4,
       calc1 * 200,
       calc1 * 12000
FROM calcCTE

答案 1 :(得分:0)

如果我正确理解你的问题,你不想在每次使用它时重复这个等式。如果是这样,请考虑一个视图,可以是永久链接,也可以是第一行中的视图,并引用选择中的列(如果是内联视图,则引用外部选择)。

答案 2 :(得分:0)

听起来你需要的是将方程定义为标量函数然后你可以做类似的事情:

SELECT dbo.calc1(col1, col2) AS Calc1, dbo.calc3(col1, col2) AS Calc3
FROM transactions

并在Calc3的函数内部,你可以返回SELECT calc2(col1, col2) * 50作为回报只返回SELECT calc1(col1, col2) * 4

只要您的方程式没有改变,这将有效。

您甚至可以进一步定义乘数变量,以便尽可能多地尝试重复使用计算。