SQL - Campos sumatorios en un mismo query con diferentes condiciones

 
Vista:

Campos sumatorios en un mismo query con diferentes condiciones

Publicado por Jason (4 intervenciones) el 23/05/2017 23:23:41
La verdad no sabía como describir claramente este problema mi manejo de SQL es un poco básico por lo que recurro a ustedes.

Tengo una Tabla con cuentas bancarias que en sintesis para lo que ocupo seria asi:

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
...

Y lo quiero es saber si en un solo query 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


Les agradezco de antemano la ayuda, saludos!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Campos sumatorios en un mismo query con diferentes condiciones

Publicado por leonardo_josue (1173 intervenciones) el 24/05/2017 16:12:25
Hola Jason:

1
2
Y lo quiero es saber si en un solo query puedo obtener lo siguiente, totalizando todo por cuenta,
moneda y tipo de movimiento:

la respuesta es si, si se puede obtener lo que quieres con una sola consulta...

¿cómo sería?, bueno, eso tienes que hacerlo tu ya que aquí no hacemos el trabajo de otros... de entrada ocupas hacer un JOIN entre tus tablas (si no sabes cómo trabajan los joins pregúntale a SANTA WIKIPEDIA:

https://es.wikipedia.org/wiki/Join

Ahora, para obtener las sumas y conteos, pues usas SUM y COUNT respectivamente, AGRUPANDO por los campos que necesitas... si tienes problemas, pregúntale a SAN GOOGLE

http://lmgtfy.com/?q=%C2%BFc%C3%B3mo+se+usa+el+COUNT+en+SQL%3F

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Campos sumatorios en un mismo query con diferentes condiciones

Publicado por Jason (4 intervenciones) el 24/05/2017 17:25:09
Primero que nada Leonardo quiero aclararte que no estoy pidiendo que me hagan mi trabajo, por tanto agradezco que no me vengas a juzgar, lo que tengo que hacer es más complejo que eso y puse un ejemplo sencillo como referencia para orientarme y realizar mi query.

Como expliqué mi manejo de SQL no es la gran cosa sin embargo sé hacer Join, Sum, Count, Group, etc., si ves bien el problema principal no es ni por hacer el Join, sino de hacer una consulta de una sola tabla y al modo en que la ocupo que es la parte donde estoy pegado y bueno recurro al foro de la Web del Programador a la que entro cada muerte de obispo y después de haber buscado bastante en Santa Wikipedia y San Google porque se supone que aquí puedo encontrar una respuesta de utilidad.

No comprendo porque en este gremio se topa uno con gente tan egoista y engreída, solo quiero una orientación para encaminarme en lo que deseo hacer, supongo que nunca en tu vida ocupaste una ayuda naciste aprendido por lo que veo..., si vas a responder por popularidad para tener x intervenciones en el foro pero van a ser respuestas tan poco valiosas como esta mejor abstente de contestar, al final lo que haces es puro SPAM, y sí sabes como se hace pero no se te viene en gana contestar como debe ser, de nuevo te pido de la manera más atenta posible que te abstengas de ensuciar el post con tus respuestas.

Agradezco cualquier otra intervención de utilidad.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Campos sumatorios en un mismo query con diferentes condiciones

Publicado por Jason (4 intervenciones) el 24/05/2017 17:59:37
Bueno por suerte me han contestado en otro lado y paso a poner la resolución aquí por si le es de utilidad a alguien más.

En esta solución se utiliza la cláusula CASE la cual en este caso condiciona la sumatoria, aspecto que desconocía:

Quedaría así:

1
2
3
4
5
6
7
8
9
10
11
12
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

Saludos!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Campos sumatorios en un mismo query con diferentes condiciones

Publicado por leonardo_josue (1173 intervenciones) el 24/05/2017 18:16:02
Hola de nuevo Jason:

Quizás te parezca que te estoy juzgando y es cierto, puede que sea mi error, pero en realidad no que juzgo es el post como tal... tal vez no sea tu caso que pidas que hagamos tu trabajo, pero creéme, hay muchos otros que si lo hacen... por eso es que en este post los colaboradores solicitamos primeramente que los foristas nos muestren qué es lo que hicieron, y en tu caso, perdóname la franqueza pero no hay ni pizca de señal de lo que intentaste hacer o de lo que buscaste de ayuda y en realidad ni siguiera haces una pregunta en concreto... preguntas si se puede hacer y te contesto que se puede hacer...

Me sorprende que digas que en este foro hay gente egoísta si es justamente todo lo contrario... nosotros no estamos aquí porque ganamos algún tipo de ingreso, sino porque nos interesa tratar de AYUDAR, tomando un tiempo libre de nuestras actividades para checar en qué podemos ayudar... y también te equivocas si piensas que lo hacemos esto por por EGO o porque somos ENGREÍDOS... en mi caso hace muchos años acudí a estos mismos foros con HUMILDAD en busca de ayuda y afortunadamente me encontré con personas mejores que yo que lo apoyaron.

En cuanto a tu problema, te repito se puede hacer y no es en realidad algo muy complicado, gracias a SAN GOOGLE hay mucha información al respecto como ya te comenté en el mi entrada anterior. No mencionas con qué BD's estás trabajando, pero dejo un ejemplo de cómo podrías hacerlo en mySQL... la sintaxis del IF no funciona en todos los DBMS's pero el CASE-WHEN debería trabajar sin problemas.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
mysql> SELECT * FROM movimientos;
+---------------+-----------+------+-------+
| id_movimiento | id_cuenta | tipo | monto |
+---------------+-----------+------+-------+
|             1 |      8877 | DB   |    10 |
|             2 |      8877 | DB   |    15 |
|             3 |      8877 | DB   |    22 |
|             4 |      8877 | CR   |    11 |
|             5 |      8877 | CR   |    13 |
|             6 |      5555 | DB   |    31 |
|             7 |      5555 | DB   |     5 |
|             8 |      5555 | DB   |    12 |
|             9 |      5555 | CR   |    17 |
|            10 |      5212 | DB   |    26 |
|            11 |      5212 | DB   |    14 |
+---------------+-----------+------+-------+
11 rows in set (0.03 sec)
 
mysql> SELECT
    ->   id_cuenta,
    ->   COUNT(1) total_movimientos,
    ->   SUM(CASE WHEN tipo = 'DB'
    ->            THEN 1 ELSE 0 END) total_movimientos_DB,
    ->   SUM(CASE WHEN tipo = 'DB'
    ->            THEN monto ELSE 0 END) monto_movimientos_DB,
    ->   SUM(IF(tipo = 'CR', 1, 0)) total_movimientos_CR,
    ->   SUM(IF(tipo = 'CR', monto, 0)) monto_movimientos_CR
    -> FROM
    ->   movimientos
    -> GROUP BY id_cuenta;
+-----------+-------------------+----------------------+----------------------+----------------------+----------------------+
| id_cuenta | total_movimientos | total_movimientos_DB | monto_movimientos_DB |total_movimientos_CR | monto_movimientos_CR |
+-----------+-------------------+----------------------+----------------------+----------------------+----------------------+
|      5212 |                 2 |                    2 |                   40 |                   0 |                    0 |
|      5555 |                 4 |                    3 |                   48 |                   1 |                   17 |
|      8877 |                 5 |                    3 |                   47 |                   2 |                   24 |
+-----------+-------------------+----------------------+----------------------+---------------------+----------------------+
3 rows in set (0.00 sec)

si esto no te sirve entonces POSTEA LO QUE TÚ INTENTASTE HACER, insisto, no importa si está mal, la idea es ayudarte a corregir lo que ya iniciaste o en su defecto ayudarte a buscar alguna otra alternativa.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Campos sumatorios en un mismo query con diferentes condiciones

Publicado por Jason (4 intervenciones) el 24/05/2017 19:59:24
Es cierto reconozco mi error en cuanto a no especificar la base de datos que utilizo, es SQL Server, pero en cuanto especificar bien mi pregunta creo que está más que entendible que busco la manera de cómo hacer ese query, no soy ningún chulo ni nada por el estilo sólo busco ayuda porque no tenía idea de como hacerlo, especifiqué bien que tengo y cuál es el resultado que deseo conseguir, más claro que eso sería explicarlo con naranjas y manzanas (y bien que se puede, es más lo podría hacer así con una animación igual a la que me pusiste para según tú "aprender" a utilizar San Google).

Disculpa también mi franqueza, pero no veo la necesidad y mucho menos alguna parte en el foro que obligue o al menos indique a los foreros que deben venir a postear aquí sus avances y los conocimientos que tengan como una garantía de que han buscado algo para que les puedan ayudar, si es por aportar información de utilidad para ayudar a la solución del problema pues excelente, pero como comente más arriba puse bien lo que tenía y lo que necesitaba, más que eso francamente no tenía porque no me imaginaba como hacer dicho query, simplemente hice una pregunta y como te dije si sabes y tienes el gusto de ayudarme te agradezco en el alma porque en realidad aún cuando me gusta la programación hay miles de cosas que desconozco y me cuestan un mundo, y creo que para alguien el simple hecho de querer ayudar es más que suficiente para no ponerse en tanta cosa, no estoy pidiendo que me hagan ningún sistema ni nada por el estilo es un simple query, no me andes metiendo en el mismo saco de los demás de buenas a primeras por que sí; y bueno si fuera el caso que simplemente no te apetece ayudar es muy respetable tu postura pero abstenerse de comentarios como esos es lo mejor, no gastes tu tiempo (que no dudo que es valioso) en respuestas vacías.

Luego Leonardo en ningún momento dije que la gente de este foro era gente egoísta y engreída, al contrario he visto muchísimas preguntas con sus amables y efectivas respuestas, si te fijas bien hablé del gremio informático como tal porque de que los hay los hay, me he encontrado con montones de esos que piensan que porque saben pueden ir por el mundo humillando a los que no, desgraciadamente también en este foro los hay, muy pocos eso sí, pero al contrario de lo que tratas de hacer ver yo no estoy encasillando al foro en ese estereotipo de gente, no tergiverses lo que pongo.

Al final se hubiese evitado tanto rollo si sólo respondías de aquí en adelante:

"No mencionas con qué BD's estás trabajando, pero dejo un ejemplo de cómo podrías hacerlo en mySQL..."

Con eso también resolvía mi duda.

La solución primera que expuse me funcionó a la perfección por tanto doy por concluida la consulta, si alguien gusta aportar algo más de valor bienvenido sea.

Saludos y que tengan buen día.

P.D.: Según veo llevas bastante en el foro y supongo que lo sabes con claridad pero por aquello de las moscas, el uso de sólo mayúsculas en una frase, exceptuando código claro está, es equivalente a gritar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar