稍后在查询中使用 '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 方式计算。这就是您需要复制代码的原因。但是您可以为此创建 subquerycte,例如:

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