稍后在查询中使用 'AS ColumnName' 的值
Use value of 'AS ColumnName' later in query
我正在创建一个存储过程,我需要在其中使用之前设置的值。我很不擅长解释这个,所以我会用一个例子:
CASE
WHEN ((select top 1 stuksweergeven from componenten
where componentid = componentlink.componentid) = 1) and
((select opbrengstperkilo from componenten
where componentid = componentlink.componentid) <> 0) THEN
amount1 * (select opbrengstperkilo from componenten
where componentid = componentlink.componentid)
ELSE
amount1
END AS Total,
Amount1 * Total *(SELECT dbo.SelectReceptenLinkGewicht(Componentid,0)) AS TotalWeight
我做了一个CASE
,结果是总计。之后我想用 Total 来计算总重量。
对不起我的英语。
问题是 SELECT
列表中的所有表达式都以 all at once
方式计算。这就是您需要复制代码的原因。但是您可以为此创建 subquery
或 cte
,例如:
with cte as(
select Amount1,
ComponentID,
CASE
WHEN ((select top 1 stuksweergeven from componenten where componentid = componentlink.componentid) = 1) and ((select opbrengstperkilo from componenten where componentid = componentlink.componentid) <> 0)
THEN amount1 * (select opbrengstperkilo from componenten where componentid = componentlink.componentid)
ELSE amount1
END AS Total
from SomeTable)
select Total,
Amount1 * Total *(SELECT dbo.SelectReceptenLinkGewicht(Componentid,0)) AS TotalWeight
from cte
或者:
select Total,
Amount1 * Total *(SELECT dbo.SelectReceptenLinkGewicht(Componentid,0)) AS TotalWeight
from (
select Amount1,
ComponentID,
CASE
WHEN ((select top 1 stuksweergeven from componenten where componentid = componentlink.componentid) = 1) and ((select opbrengstperkilo from componenten where componentid = componentlink.componentid) <> 0)
THEN amount1 * (select opbrengstperkilo from componenten where componentid = componentlink.componentid)
ELSE amount1
END AS Total
from SomeTable) t
您完全可以使用 CROSS APPLY
让一切为您所用。一篇内容丰富的文章:http://sqlmag.com/blog/tip-apply-and-reuse-column-aliases
只需使用派生的 table,例如:
select col1, col2
from (select c1 * c2 + c3 as col1,
... as col2
from tablename)
where col1 = ...
您可以使用交叉应用
SELECT
t.Amount1 * x.Total * dbo.SelectReceptenLinkGewicht(t.Componentid,0)
AS TotalWeight
FROM table t
CROSS APPLY
(
SELECT
CASE
WHEN ((SELECT top 1 stuksweergeven from componenten
WHERE componentid = componentlink.componentid) = 1) and
((SELECT opbrengstperkilo from componenten
WHERE componentid = componentlink.componentid) <> 0) THEN
amount1 * (select opbrengstperkilo from componenten
WHERE componentid = componentlink.componentid)
ELSE
amount1
END AS Total
) x
我正在创建一个存储过程,我需要在其中使用之前设置的值。我很不擅长解释这个,所以我会用一个例子:
CASE
WHEN ((select top 1 stuksweergeven from componenten
where componentid = componentlink.componentid) = 1) and
((select opbrengstperkilo from componenten
where componentid = componentlink.componentid) <> 0) THEN
amount1 * (select opbrengstperkilo from componenten
where componentid = componentlink.componentid)
ELSE
amount1
END AS Total,
Amount1 * Total *(SELECT dbo.SelectReceptenLinkGewicht(Componentid,0)) AS TotalWeight
我做了一个CASE
,结果是总计。之后我想用 Total 来计算总重量。
对不起我的英语。
问题是 SELECT
列表中的所有表达式都以 all at once
方式计算。这就是您需要复制代码的原因。但是您可以为此创建 subquery
或 cte
,例如:
with cte as(
select Amount1,
ComponentID,
CASE
WHEN ((select top 1 stuksweergeven from componenten where componentid = componentlink.componentid) = 1) and ((select opbrengstperkilo from componenten where componentid = componentlink.componentid) <> 0)
THEN amount1 * (select opbrengstperkilo from componenten where componentid = componentlink.componentid)
ELSE amount1
END AS Total
from SomeTable)
select Total,
Amount1 * Total *(SELECT dbo.SelectReceptenLinkGewicht(Componentid,0)) AS TotalWeight
from cte
或者:
select Total,
Amount1 * Total *(SELECT dbo.SelectReceptenLinkGewicht(Componentid,0)) AS TotalWeight
from (
select Amount1,
ComponentID,
CASE
WHEN ((select top 1 stuksweergeven from componenten where componentid = componentlink.componentid) = 1) and ((select opbrengstperkilo from componenten where componentid = componentlink.componentid) <> 0)
THEN amount1 * (select opbrengstperkilo from componenten where componentid = componentlink.componentid)
ELSE amount1
END AS Total
from SomeTable) t
您完全可以使用 CROSS APPLY
让一切为您所用。一篇内容丰富的文章:http://sqlmag.com/blog/tip-apply-and-reuse-column-aliases
只需使用派生的 table,例如:
select col1, col2
from (select c1 * c2 + c3 as col1,
... as col2
from tablename)
where col1 = ...
您可以使用交叉应用
SELECT
t.Amount1 * x.Total * dbo.SelectReceptenLinkGewicht(t.Componentid,0)
AS TotalWeight
FROM table t
CROSS APPLY
(
SELECT
CASE
WHEN ((SELECT top 1 stuksweergeven from componenten
WHERE componentid = componentlink.componentid) = 1) and
((SELECT opbrengstperkilo from componenten
WHERE componentid = componentlink.componentid) <> 0) THEN
amount1 * (select opbrengstperkilo from componenten
WHERE componentid = componentlink.componentid)
ELSE
amount1
END AS Total
) x