如何在 SQL Server 中连接 3 个表并根据 2 个关键字段计算值

问题描述 投票:0回答:1

我有 3 个表需要连接,其中 2 个对于计算值并在第三个表中提供它很重要,问题是在这 2 个表中我有 2 个字段需要分组以进行计算。这些是表格:

第一张表:

SELECT    customerId, baseCurrencyId, SUM(amount) AS totalRecovered
FROM      dbo.RecoveredDebt
WHERE     (isDeleted = 0)
GROUP BY  customerId, baseCurrencyId;

首次查询结果:

客户ID 基础货币ID 已恢复总数
2 1 950
4 1 10
1 2 100
2 2 500

第二张表:

SELECT    customerId, baseCurrencyId, SUM(amount) AS totalOld
FROM      dbo.OldDebt
WHERE     (isDeleted = 0)
GROUP BY  customerId, baseCurrencyId;

第二次查询结果:

客户ID 基础货币ID 总旧
2 1 2000
1 2 100
2 2 300

现在技巧来了,我想从客户表中进行选择并具有以下字段: id(客户 ID)、baseCurrencyId、totalOldDebt(来自第一个查询)、totalRecoveredDebt(来自第二个查询)、totalDebt(totalOldDebt -totalRecoveredDebt)。但我希望它按 baseCurrencyId 进行分组,例如,如果客户有超过一种货币的债务,则必须对每个货币进行计算,如果一个表中存在包含一种货币的行,但另一个表中没有,则这些值因为那一定是 zore 并且计算仍然会发生。

这是我根据提供的表格计算后的预期结果:

id 基础货币ID 旧债总额 已收回债务总额 债务总额
1 2 100 100 0
2 1 2000 950 1050
2 2 300 500 -200
4 1 0 10 -10

我尝试过使用 CTE,但我不知道该怎么做:

WITH OldCTE AS (
    SELECT    customerId, baseCurrencyId, SUM(amount) AS totalOld
    FROM      dbo.OldDebt
    WHERE     (isDeleted = 0)
    GROUP BY  customerId, baseCurrencyId
), RecoveredCTE AS (
    SELECT    customerId, baseCurrencyId, SUM(amount) AS totalRecovered
    FROM      dbo.RecoveredDebt
    WHERE     (isDeleted = 0)
    GROUP BY  customerId, baseCurrencyId
)
SELECT     C.id
FROM       Customer AS C
LEFT JOIN  OldCTE AS OCTE ON OCTE.customerId = C.id
LEFT JOIN  RecoveredCTE AS RCTE ON RCTE.customerId = C.id
sql sql-server
1个回答
0
投票

如果您想使用 CTE 作为变体:

WITH OldCTE AS (
    SELECT    customerId, baseCurrencyId, SUM(amount) AS totalOld
    FROM      dbo.OldDebt
    WHERE     (isDeleted = 0)
    GROUP BY  customerId, baseCurrencyId
), RecoveredCTE AS (
    SELECT    customerId, baseCurrencyId, SUM(amount) AS totalRecovered
    FROM      dbo.RecoveredDebt
    WHERE     (isDeleted = 0)
    GROUP BY  customerId, baseCurrencyId
)
SELECT C.id,
coalesce(OCTE.totalOld, 0) as totalOldDebt,
coalesce(RCTE.totalRecovered, 0) as totalRecoveredDebt,
coalesce(OCTE.totalOld, 0) - coalesce(RCTE.totalRecovered, 0) as totalDebt
FROM OldCTE AS OCTE
FULL JOIN  RecoveredCTE AS RCTE ON RCTE.customerId = OCTE.customerId and OCTE.baseCurrencyId = RCTE.baseCurrencyId
JOIN Customer as C on C.id = coalesce(OCTE.customerId, RCTE.customerId)
© www.soinside.com 2019 - 2024. All rights reserved.