SQLServer-SUM 互相子查询

SQL Server- SUM Subquery each other

我想在SQL服务器.

中寻求一点帮助

如何将彼此的子查询求和并显示在一列中。

我测试在 SELECT 语句中添加子查询,但是,后来我意识到我不知道如何在它们之间求和,然后我将它们添加到 FROM 语句中以看看如果我在 SELECT 语句中将它们加起来可能会起作用,但它没有。

想法是对每个 CodUbic.

用 A 减去 B
  1. 'A' 购买 ($),

  2. 'B' 退货 ($)

    SELECT MONTH(FechaE) 作为我, YEAR(FechaE) AS Ano, 科比, TipoFac, (SumFacA + SumFacB)

    FROM 
        dbo.SAFACT,
        (SELECT SUM(Monto) FROM dbo.SAFACT WHERE TipoFac IN ('A')) AS SumFacA,
        (SELECT -SUM(Monto) FROM dbo.SAFACT WHere TipoFac IN ('B')) AS SumFacB
    
    WHERE
        TipoFac IN ('A', 'B')
    GROUP BY  
        MONTH(FechaE),
        YEAR(FechaE),
        CodUbic,
        TipoFac
    
    ORDER BY 
        YEAR(FechaE) DESC, 
        MONTH(FechaE);
    

预期结果:

    Mes   Ano    CodUbic            TotalSum
   ----------------------------------------------------
     1    2022    0002-1     #### (Due the sum of A-B)   
     1    2022    0004-1     #### (Due the sum of A-B)
     2    2022    0002-1     #### (Due the sum of A-B)
     2    2022    0004-1     #### (Due the sum of A-B) 
    ...    ...     ...           ...

简单:

SELECT 
    MONTH(FechaE) AS Mes,
    YEAR(FechaE) AS Ano,
    CodUbic,
    SUM(CASE WHEN TipoFac = 'A' THEN ISNULL(Monto,0) ELSE 0 END) -
    SUM(CASE WHEN TipoFac = 'B' THEN ISNULL(Monto,0) ELSE 0 END)

FROM 
    dbo.SAFACT

WHERE
    TipoFac IN ('A', 'B')
GROUP BY  
    MONTH(FechaE),
    YEAR(FechaE),
    CodUbic
    
ORDER BY 
    YEAR(FechaE) DESC, 
    MONTH(FechaE);

您终于显示了预期的结果。它不包含 TipoFac 的列。这意味着,您想要每个月和 CodUbic 的结果行,而不是每个月、CodUbic 和 TipoFac。相应地更改您的 GROUP BY 子句。

您可以通过条件聚合(CASE WHEN 聚合函数内部)获得 A 和 B 之间的差异。

SELECT
    MONTH(FechaE) AS Mes, YEAR(FechaE) AS Ano, CodUbic,
    SUM(CASE WHEN TipoFac = 'A' THEN monto ELSE -monto END) AS diff
FROM 
    dbo.SAFACT
WHERE
    TipoFac IN ('A', 'B')
GROUP BY  
    MONTH(FechaE), YEAR(FechaE), CodUbic
ORDER BY 
    YEAR(FechaE) DESC, MONTH(FechaE), CodUbic
;