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
列中的所有值都是动态的,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-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
)。