我有这个问题:
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
可视化:黄色部分通过添加计算重复自身......
这样做的最佳方式是什么?
答案 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
只要您的方程式没有改变,这将有效。
您甚至可以进一步定义乘数变量,以便尽可能多地尝试重复使用计算。