2015-06-03 66 views
2

我需要计算Quantity列的值,其中Name = A使用这个公式中的SQL服务器:SQL-Server。计算公式与子查询中聚合函数

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. 

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

+2

派生表? – jarlh

回答

3

我会倾向于使用条件聚合得到的变量值:

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 s)。

+0

谢谢你的答案,伟大的解决方案! +1 –