SQLServer-SUM 互相子查询
SQL Server- SUM Subquery each other
我想在SQL服务器.
中寻求一点帮助
如何将彼此的子查询求和并显示在一列中。
我测试在 SELECT
语句中添加子查询,但是,后来我意识到我不知道如何在它们之间求和,然后我将它们添加到 FROM
语句中以看看如果我在 SELECT
语句中将它们加起来可能会起作用,但它没有。
想法是对每个 CodUbic.
用 A 减去 B
'A' 购买 ($),
'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
;
我想在SQL服务器.
中寻求一点帮助如何将彼此的子查询求和并显示在一列中。
我测试在 SELECT
语句中添加子查询,但是,后来我意识到我不知道如何在它们之间求和,然后我将它们添加到 FROM
语句中以看看如果我在 SELECT
语句中将它们加起来可能会起作用,但它没有。
想法是对每个 CodUbic.
用 A 减去 B'A' 购买 ($),
'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
;