SQL-服务器。在聚合函数中使用子查询计算公式

SQL-Server. Calculate formula with subquery in aggregate function

我需要在 SQL-Server:

中使用此公式计算 Quantity 列的值,其中 Name = A
A(Quantity) = (B*B1 + C*C1 + D*D1) / SUM(B1 + C1 + D1) + E

示例数据:

Static  Static   Dynamic   
 Name     ID     Quantity  -- Here are more columns, but doesn't matter
 A        1         ? -- need to calculate this value
 B        2         4
 C        3         6
 D        4         8
 E        5         5
 A1       6         -
 B1       7         2
 C1       8         3
 D1       9         4

你有什么想法吗? Quantity 列中的所有值都是动态的,NameId 列中的所有值都是静态的。

我想像下面这样,但是存在子查询不能在聚合函数中使用的问题:

SELECT Name,
       Id,
       ISNULL(MAX(CASE WHEN f.Period = YEAR(GETDATE())*100 + 01 THEN
                       CASE WHEN Name = 'A' THEN 
                              (SELECT Quantity FROM Cte WHERE Name = 'A' ) *
                              (SELECT Quantity FROM Cte WHERE Name = 'A1') +
                              (SELECT Quantity FROM Cte WHERE Name = 'B' ) *
                              (SELECT Quantity FROM Cte WHERE Name = 'B1') 
                               ................... 
                            ELSE Quantity 
                       END 
                   END), 0) as Quantity
FROM tbl...

我收到以下错误:

Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

你有什么想法如何在聚合函数中使用子查询或任何其他方式来计算它?

我倾向于使用条件聚合来获取变量的值:

select max(case when name = 'B' then quantity end) as B,
       . . .,
       max(case when name = 'D1' then quantity end) as D
from sample s;

然后您可以将其合并到更新中:

with variables as (
      select max(case when name = 'B' then quantity end) as B,
             . . .,
             max(case when name = 'D1' then quantity end) as D
      from sample s
     )
update s
    set s.value = (B*B1 + C*C1 + D*D1) / SUM(B1 + C1 + D1) + E
    from sample s cross join
         variables v
    where name = 'A';

注意:还有其他方法可以旋转数据;条件聚合只是一种方法(使用 pivot,使用多个 join)。