按JOIN表中的条件求和

时间:2012-10-25 16:44:05

标签: sql sql-server

我的数据库有这样的结构: enter image description here

'Movimientos'表记录了我系统的所有费用和付款。 'Cargos'表格在'Movimientos'和'Abonos'表格中保留了每笔费用的一些元数据,并在'Movimientos'上保留了每笔付款的一些元数据。

如何编写一个查询,总结'Movimientos'中所有记录,其中'Abonos.tipo_abono'和'Cargos.tipo_cargo'有一些标准?

我有一个已经加上'Movimientos'的查询但是我不能添加“Abonos”和“Cargos”表添加更多标准的部分。

SELECT SUM(M.monto) as monto, SUM(M.interes) as interes, SUM(M.iva) as iva, SUM(M.capital) as capital
                FROM movimientos AS M
                JOIN acreditados AS A ON A.id_acreditado = M.id_acreditado
                JOIN creditos AS C ON C.id_credito = A.id_credito
                WHERE  C.id_credito = 29

假设我想修改最后一个查询只是对'Abono.tipo_abono'= 1和'Cargos.tipo_cargo'= 1的记录求和,我该怎么做?

1 个答案:

答案 0 :(得分:3)

如果您的关系是一对一的,您可以加入表格并按您的条件过滤。如果始终存在相关记录,请将其作为内部联接。如果相关表格可能没有记录,则应该是LEFT OUTER JOIN,其JOIN而不是WHERE中指定的条件。

SELECT SUM(M.monto) as monto,
    SUM(M.interes) as interes,
    SUM(M.iva) as iva,
    SUM(M.capital) as capital
FROM movimientos AS M
JOIN acreditados AS A ON A.id_acreditado = M.id_acreditado
JOIN creditos AS C ON C.id_credito = A.id_credito
LEFT OUTER JOIN Abonos AS AB on AB.id_movimiento = M.id_movimiento AND AB.tipo_abono = 1
LEFT OUTER JOIN Cargos AS CG on CG.id_movimiento = M.id_movimiento AND CG.tipo_cargo = 1
WHERE  C.id_credito = 29

但是,如果您的关系是多对一关系,则会通过包含多个movimientos行来影响您的总和。请改用EXISTS子句:

SELECT SUM(M.monto) as monto,
    SUM(M.interes) as interes,
    SUM(M.iva) as iva,
    SUM(M.capital) as capital
FROM movimientos AS M
JOIN acreditados AS A ON A.id_acreditado = M.id_acreditado
JOIN creditos AS C ON C.id_credito = A.id_credito
WHERE  C.id_credito = 29
AND EXISTS (SELECT 1
    FROM Abonos AB
    WHERE AB.id_movimiento = M.id_movimiento
    AND tipo_abono = 1
)
AND EXISTS (SELECT 1
    FROM Cargos CG
    WHERE CG.id_movimiento = M.id_movimiento
    AND tipo_cargo = 1
)