我需要在 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
列中的所有值都是动态的,Name
和 Id
列是静态的。
我认为类似于下面的内容,但是存在子查询不能在聚合函数中使用的问题:
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
)。
关于SQL 服务器。聚合函数中使用子查询计算公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30619398/