2015-06-03 65 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 –