0

私のデータベースは次のような構造になっています。 ここに画像の説明を入力してください

「Movimientos」テーブルには、システムのすべての料金と支払いの記録が保持されます。「Cargos」テーブルは「Movimientos」の各料金のメタデータを保持し、「Abonos」テーブルは「Movimientos」の各支払いのメタデータを保持します。

'Abonos.tipo_abono'と'Cargos.tipo_cargo'にいくつかの基準がある'Movimientos'のすべてのレコードを合計するクエリを作成するにはどうすればよいですか?

「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のレコードを合計するようにしたいとします。どうすればよいですか?

4

1 に答える 1

3

関係が1対1の場合は、テーブルを結合して、条件でフィルタリングできます。関連するレコードが常に存在する場合は、それを内部結合にします。関連するテーブルにレコードがない場合は、ではなくでLEFT OUTER JOIN指定された基準を持つ必要があります。JOINWHERE

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

ただし、関係が多対1の場合、これは複数の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
)
于 2012-10-25T16:49:43.947 に答える