none
Campos sumatorios en un mismo query con diferentes condiciones RRS feed

  • Pregunta

  • La verdad no sabía como describir claramente este problema...

    Tengo una tabla con cuentas bancarias que en síntesis para lo que ocupo seria así:

    CuentasBancarias
    _______________
    #numeroCuenta
    nombreCuenta

    Ejemplo de datos:

    '124578877', 'BANCO YYY'
    '124575555', 'BANCO mm'
    '124575212', 'BANCO jjjjjjjj'

    Y otra tabla con el detalle de movimientos de esas cuentas:

    MovimientosCuentas
    __________________
    #numeroDocumento
    numeroCuenta
    montoLocal 
    montoDolar
    tipoMovimiento (los tipos de movimiento serán 'DB' y 'CR')

    Ejemplo de datos:

    551, '124578877', 500, 1, CR
    552, '124578877', 500, 1, CR
    553, '124578877', 500, 1, DB
    554, '124578877', 500, 1, DB

    ...

    Lo que deseo es saber si en un solo query o bien de alguna otra manera que garantice una ejecución eficiente puedo obtener lo siguiente, totalizando todo por cuenta, moneda y tipo de movimiento:

    Numero de Cuenta | Nombre de la Cuenta | Total DB | Total CR | Total DB$ | Total CR$
    ________________________________________________________________________
    124578877 | BANCO YYY | 1.000 | 1.000 | 2 | 2
    124575555 | BANCO mm | 2.000 | 2.000 | 4 | 4
    124575212 | BANCO jjjjjjjj| 6.000 | 6.000 | 3 | 3 

    Espero haberme explicado bien y que me puedan ayudar.

    Les agradezco de antemano, saludos!!


    miércoles, 24 de mayo de 2017 15:06

Respuestas

  • Basta con sumarizar valores agrupados bajo algún criterio y escribirlos en columnas mediante CASE, por ejemplo:

    SELECT
        cb.numeroCuenta, nombreCuenta,
        SUM(CASE WHEN mc.tipoMovimiento = 'DB' THEN mc.montoLocal END) AS [Total DB],
        SUM(CASE WHEN mc.tipoMovimiento = 'CR' THEN mc.montoLocal END) AS [Total CR],
        SUM(CASE WHEN mc.tipoMovimiento = 'DB' THEN mc.montoDolar END) AS [Total DB$],
        SUM(CASE WHEN mc.tipoMovimiento = 'CR' THEN mc.montoDolar END) AS [Total CR$]
    FROM
        CuentasBancarias cb
        INNER JOIN MovimientosCuentas mc ON (cb.numeroCuenta = mc.numeroCuenta)
    GROUP BY cb.numeroCuenta, nombreCuenta
    ORDER BY cb.numeroCuenta;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Jim AT miércoles, 24 de mayo de 2017 16:02
    miércoles, 24 de mayo de 2017 15:19
  • Hola

    puedes sumar condicionando los valores que necesitas:

    Select numerocuenta, nombrecuenta,
    Sum(Case when m.tipoMovimiento = 'DB' then m.montoLocal end) DB,
    Sum(Case when m.tipoMovimiento = 'DB' then m.montoDolar end) DBDolares,
    Sum(Case when m.tipoMovimiento = 'CR' then m.montoLocal end) CR,
    Sum(Case when m.tipoMovimiento = 'CR' then m.montoDolar end) CRDolares
    from CuentasBancarias c inner join MovimientosCuentas m
    on c.numeroCuenta = m.numeroCuenta
    group by  numerocuenta, nombrecuenta

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    • Marcado como respuesta Jim AT miércoles, 24 de mayo de 2017 16:02
    miércoles, 24 de mayo de 2017 15:24

Todas las respuestas

  • Basta con sumarizar valores agrupados bajo algún criterio y escribirlos en columnas mediante CASE, por ejemplo:

    SELECT
        cb.numeroCuenta, nombreCuenta,
        SUM(CASE WHEN mc.tipoMovimiento = 'DB' THEN mc.montoLocal END) AS [Total DB],
        SUM(CASE WHEN mc.tipoMovimiento = 'CR' THEN mc.montoLocal END) AS [Total CR],
        SUM(CASE WHEN mc.tipoMovimiento = 'DB' THEN mc.montoDolar END) AS [Total DB$],
        SUM(CASE WHEN mc.tipoMovimiento = 'CR' THEN mc.montoDolar END) AS [Total CR$]
    FROM
        CuentasBancarias cb
        INNER JOIN MovimientosCuentas mc ON (cb.numeroCuenta = mc.numeroCuenta)
    GROUP BY cb.numeroCuenta, nombreCuenta
    ORDER BY cb.numeroCuenta;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Jim AT miércoles, 24 de mayo de 2017 16:02
    miércoles, 24 de mayo de 2017 15:19
  • Hola

    puedes sumar condicionando los valores que necesitas:

    Select numerocuenta, nombrecuenta,
    Sum(Case when m.tipoMovimiento = 'DB' then m.montoLocal end) DB,
    Sum(Case when m.tipoMovimiento = 'DB' then m.montoDolar end) DBDolares,
    Sum(Case when m.tipoMovimiento = 'CR' then m.montoLocal end) CR,
    Sum(Case when m.tipoMovimiento = 'CR' then m.montoDolar end) CRDolares
    from CuentasBancarias c inner join MovimientosCuentas m
    on c.numeroCuenta = m.numeroCuenta
    group by  numerocuenta, nombrecuenta

    Saludos


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    • Marcado como respuesta Jim AT miércoles, 24 de mayo de 2017 16:02
    miércoles, 24 de mayo de 2017 15:24
  • Williams te agradezco mucho me sirvió de maravilla!
    miércoles, 24 de mayo de 2017 16:03
  • Muchas gracias!!
    miércoles, 24 de mayo de 2017 16:03