我有 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
如果您想使用 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)