我在 SQL 服务器中遇到此错误 - "Cannot perform an aggregate function on an expression containing an aggregate or a subquery."

I am facing this error in SQL Server - "Cannot perform an aggregate function on an expression containing an aggregate or a subquery."

我正在尝试 运行 以下查询,但遇到此错误:

Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

SELECT 
        IVCSUM1.ivcnum "Invoice Number"
        ,IVCSUM1.ivcgrsamt_amt "Gross Amount"
        ,IVCSUM1.ivcgrsamt_cur "Gross Amount Currency"
        ,SUM(ISNULL(IVCLINE1.ivclinextamt_amt, 0) 
            + ISNULL((SELECT SUM(TaxAmount_amt) FROM MC_INVTAX WHERE ivclinref_oi = IVCLINE1.ivlnoi), 0) 
            + ISNULL((SELECT SUM(amtchg_amt) FROM MC_INVCHG INVCHG1 WHERE IVCLINE1.ivlnoi = ivclinref_oi), 0)) "Invoice Line Amount"
    FROM
        MC_IVCSUM IVCSUM1 LEFT JOIN
        MC_IVCLINE IVCLINE1 on IVCSUM1.ivsmoi = IVCLINE1.invsumm_oi
    GROUP BY ivsmoi, ivcnum,IVCSUM1.ivcgrsamt_amt, IVCSUM1.ivcgrsamt_cur

我无法将表 MC_INVCHGMC_INVTAX 连接到主查询,因为它会导致重复IVCLINE1.ivclinextamt_amt 字段和总和最终是错误的。

下面是我通过连接表格从表格中提取的示例数据。

Invoice Number Line Gross Amount Tax amount Change
00 0001180 7 DEC03 1 80 -5.04 NULL
00 0001180 7 DEC03 1 80 5.04 NULL
00 0001180 7 DEC03 2 40 2 NULL

我想通过查询完成的是,发票行金额 = (80 + (5.04 + (-5.04)) + 0) + (40 + 2 + 0)

由于更改为 NULL,因此它被视为 0。

有没有其他方法可以做到这一点?

这是使用 CROSS APPLY 的好地方,因为它允许您计算一个值然后使用它,而没有您已经 运行 进入的限制。

SELECT 
    IVCSUM1.ivcnum [Invoice Number]
    , IVCSUM1.ivcgrsamt_amt [Gross Amount]
    , IVCSUM1.ivcgrsamt_cur [Gross Amount Currency]
    , SUM(ISNULL(IVCLINE1.ivclinextamt_amt, 0) 
        + ISNULL(S1.TaxAmount_amt_Total, 0) 
        + ISNULL(S2.amtchg_amt_Total, 0)) [Invoice Line Amount]
FROM MC_IVCSUM IVCSUM1
LEFT JOIN MC_IVCLINE IVCLINE1 on IVCSUM1.ivsmoi = IVCLINE1.invsumm_oi
CROSS APPLY (
  SELECT SUM(TaxAmount_amt) TaxAmount_amt_Total
  FROM MC_INVTAX
  WHERE ivclinref_oi = IVCLINE1.ivlnoi
) S1
CROSS APPLY (
    SELECT SUM(amtchg_amt) amtchg_amt_Total
    FROM MC_INVCHG INVCHG1
    WHERE IVCLINE1.ivlnoi = ivclinref_oi
) S2
GROUP BY ivsmoi, ivcnum, IVCSUM1.ivcgrsamt_amt, IVCSUM1.ivcgrsamt_cur;

注意方括号 [] 是转义对象名称的最佳做法。