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

标签 sql sql-server t-sql subquery aggregate-functions

我需要在 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)。

关于SQL 服务器。聚合函数中使用子查询计算公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30619398/

相关文章:

sql - 多列全外连接

mysql - 转换成 View 时sql参数错误

sql - 使用用户定义的表类型时数据类型无效

sql - 如何检查 Postgres 中的数组是否为空

MySQL 子查询的查询性能 - 具有数百万行的表

mysql - MySQL数据库的正确设计

.net - 将 MS sql server (aspnetdb) 表、存储过程等与我自己的数据库合并?

sql-server - T-SQL - #tempimport 在哪里?

sql-server - 将日期时间转换为字符串并在 SQL Server 中显示为 'yyyy_MM'

SQL Server 2008 复杂查询和表连接