我的数据库有这样的结构:
'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的记录求和,我该怎么做?
答案 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
)