Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   como sumar con nulos? (https://www.clubdelphi.com/foros/showthread.php?t=59601)

ninguno 08-09-2008 13:26:38

Hola

Cita:

Empezado por egostar (Mensaje 312331)
Acaso hemos dicho lo contrario ????

Sí, fíjate mi cita de Caral ;)

Cita:

Empezado por egostar (Mensaje 312331)
:D:D, Pues por desgracia hemos estado suponiendo todo este tiempo muchas cosas, el problema es que no se nos pone la información necesaria para llegar a una solución.......

Como he dicho, si en un mes puede haber más de 1 tipo de condición y no todos los registros están informados, será difícil, por no decir imposible, hacer esa suma dado que NO podrás saber a qué condición agregarle esos registros sin condición.

lledesma 08-09-2008 16:04:25

Perdon si generé lios, no era mi intencion. Igual gracias por los aportes. Y me corrijo, El resto de informacion que falta en los datos no tiene relevancia, por cuanto no sirve a los propositos que busco, el ejemplo que pongo a consideración es tal cual se utiliza en el procedimiento. De nuevo, gracias

gmontes 08-09-2008 16:17:20

Cita:

Empezado por lledesma (Mensaje 310996)
Hola comunidad:

Recurro a uds por que puedo dar con la solucion:
tengo p.e. 3 registros
idcliente - mes - condicion importe
1 1 N 100
1 1 null -50
1 1 null -20


y tengo que obtener

1 1 N 30
Utilizo firebird 2.0 y es en un procedimiento almacenado

Actualmente uso:
Código SQL [-] select idcliente,mes,condicion,sum(importe) from cuentas group by idcliente,mes,condicion


obtengo
1 1 N 100
1 1 null -70

Muchas gracias


si la condicion no importa, solo quitala del select y del group

Caro 08-09-2008 16:41:20

Cita:

Empezado por gmontes (Mensaje 312408)
si la condicion no importa, solo quitala del select y del group

Ahí esta el problema la condición si importa, como he dicho al principio, con esta consulta.

Código SQL [-]
select idcliente, mes, sum(importe) from cuentas group by idcliente,mes

ya obtenemos lo que el amigo quiere

Código:

5  1  M  50
5  2  B  40
5  3  C  35

pero no sabemos a que condición pertenece cada uno de esos registros, ahora si aumentamos en el group by la condición, obtrendremos este resultado ya que nos va a agrupar por ese campo mas.

Código:

5  1  null  -50
5  1  M    100
5  2  null  -30
5  2  B      70
5  3  null  -5
5  3  C      35

y es lo que no se quiere, entonces la pregunta sería como añadir mas campos en una consulta con group by pero sin colocarlo en el group by para que no afecte en la agrupación. De hecho si utilizamos group by y queremos mostrar un campo en el select tenemos que añadirlo en el group by.

La verdad yo también quisiera saber como hacer eso.

Saluditos

Caral 08-09-2008 16:56:04

Hola
A mi no me hagáis caso, de estas cosas no se, solo opino.
Saludos

gmontes 08-09-2008 16:59:39

el problema es que

tiene lo siguiente:

1 1 N 100
1 1 null -50
1 1 null -20

y quiere obtener 1 1 N 30

select idcliente,mes,condicion,sum(importe) from cuentas group by idcliente,mes,condicion

obtiene
1 1 N 100
1 1 null -70

lo cual es valido porque agrupa por por condicion

o sea que si la condicion fuera por B

1 1 B 200
1 1 N 100
1 1 null -50
1 1 null -20

el quisiera obtener
1 1 B 130

es decir, que las condiciones Null se sumen a cualquier condicion que se seleccione.

pues que en el procedure tenga dos select

select idcliente,mes,condicion,sum(importe) from cuentas where condicion = "N" group by idcliente,mes,condicion



y la segunda

select idcliente,mes,condicion,sum(importe) from cuentas where condicion is NULL group by idcliente,mes,condicion

y que los campos de salida del importe sea la suma de ambas condiciones

Caro 08-09-2008 17:12:50

Te endiendo amiguito GMontes, pero si nos fijamos en los datos que nos puso si sabemos a donde pertenecen los null, los registros en rojo le pertenecen al mes 1, los verdes al mes 2 y el azul al mes 3, por eso decía que con la agrupación de solo cliente y condición ya obtenemos lo que queremos.

Cita:

Empezado por lledesma (Mensaje 312298)
idcliente -------mes------------ condicion-----------importe
5---------------1-----------------M----------------- 100
5---------------1-----------------null--------------- -30
5---------------1-----------------null--------------- -20
5---------------2-----------------B----------------- 70
5---------------2-----------------null--------------- -20
5---------------2-----------------null--------------- -10
5---------------3-----------------C---------------- 40
5---------------3-----------------null-------------- -5

Acabo de hacer una prueba de esta consulta y si funciona, se obtiene lo que quiere el amigo, por lo menos a mi me funciona, pero nose que tan bien pueda estar. Lo he probado en Firebird por si acaso.

Código SQL [-]
select c1.idcliente, c1.mes, c1.condicion, 
        (select sum(importe) 
         from clientes where idcliente=c1.idcliente and mes=c1.mes group by id_cliente, mes)
from clientes c1
where condicion  is not Null

Saluditos

egostar 08-09-2008 17:19:25

Hola amiguita [Caro]

Y que pasaría si en un mismo mes tiene las opciones N,M,B,C,X,Y,Z y tiene el mismo cliente varias veces.

Ahi es donde yo tengo la duda de que se pueda hacer así como lo plantea lledesma

Yo creo que hace falta mas información para poder "adivinar" este asunto.

Salud OS

Caro 08-09-2008 17:38:11

Cita:

Empezado por egostar (Mensaje 312429)
Y que pasaría si en un mismo mes tiene las opciones N,M,B,C,X,Y,Z y tiene el mismo cliente varias veces.
Ahi es donde yo tengo la duda de que se pueda hacer así como lo plantea lledesma
Yo creo que hace falta mas información para poder "adivinar" este asunto.

En ese caso egopolice :rolleyes:, ya no funciona lo ultimo que puse, yo me he basado en el ultimo ejemplo y explicación que puso Iledesma.

Saluditos

egostar 08-09-2008 17:41:53

Cita:

Empezado por Caro (Mensaje 312439)
En ese caso egopolice :rolleyes:, ya no funciona lo ultimo que puse, yo me he basado en el ultimo ejemplo y explicación que puso Iledesma.

Saluditos

Pues si, me parece que el buen amigo lledesma nos está dando las cosas a cuenta gotas :D

Salud ITOS

PD, Apurale que ya veo que varios tienen ganas de festejar a un nuevo milenario :)

maeyanes 08-09-2008 17:46:23

Hola...

Cita:

Empezado por egostar (Mensaje 312429)
Hola amiguita [Caro]

Y que pasaría si en un mismo mes tiene las opciones N,M,B,C,X,Y,Z y tiene el mismo cliente varias veces.

Ahi es donde yo tengo la duda de que se pueda hacer así como lo plantea lledesma

Yo creo que hace falta mas información para poder "adivinar" este asunto.

Salud OS

Pues según entiendo (y a lo mejor entiendo mal :p), para cada mes solo puede existir una condición con valor (importes positivos) y varias nulas (importes negativos), de tal forma que, si entendí bien, la consulta de Caro debería servir bien...


Saludos...

Caro 08-09-2008 17:59:05

Cita:

Empezado por egostar (Mensaje 312442)
PD, Apurale que ya veo que varios tienen ganas de festejar a un nuevo milenario :)

Espero llegar mañana amiguito :), muchas gracias por fijarte ;).

Saluditos

hach 08-09-2008 18:39:47

A ver si entendi...
 
Hola otra vez!!!
A ver si entendi:
1) la factura tiene una condicion y un importe
2) los pagos tienen importes pero no condicion

es asi?

La unica forma de hacer lo que querés es saber la condicion de los pagos, y como no la tienes, la unica forma sería si podés vincular un pago a una determinada factura
Es eso posible? Un pago corresponde a una factura determinada? Tenés forma de vincularlos mediante los datos que tenés?
Si es así, es sencillo, basta con traer la condicion de la factura a la cual pertenece el pago en el select
Si no es asi, no le des mas vueltas...

en algun lado dices:

Cita:

necesito saber por cada mes el saldo y la condicion que tenia el cliente en ese mes asumiento que los nullos tienen que tener el valor de la condicion correspondiente a la factura
La condicion es propia del cliente?
Podrias vincular el cliente con el pago, y obtener la condicion
pero si cambia de mes a mes, solo obtendrias la ultima condicion, salvo que lleves un historico de condiciones...



Saludos

Pablo

Delphius 08-09-2008 19:41:59

Yo todavía no comprendo bien lo que busca (por empezar que no me queda totalmente claro como está estructurada la tabla) y esquivé al hilo lo más que pude.
Me acerco ahora a preguntarle, o aconsejarle (no me decido si es una duda o o un consejo) ¿Consideraste estructurar la tabla y/o la información de otra manera? ¿Podríamos conocer mejor la estructura de tus tablas?

Saludos,

lledesma 08-09-2008 23:52:09

Hola a todos

Creo que Caro es la que resumio un poco lo que no supe explicar

cita:
Cita:

...y es lo que no se quiere, entonces la pregunta sería como añadir mas campos en una consulta con group by pero sin colocarlo en el group by para que no afecte en la agrupación. De hecho si utilizamos group by y queremos mostrar un campo en el select tenemos que añadirlo en el group by...


La estructura esta armada de ese modo y no puede modificarla.
Cada cliente puede tener solo una factura por mes con cualquier tipo de condicion y sus respectivos pagos, valores negativos, estan asociados a la factura por idcliente,ano,mes.

La informacion no se va dando a cuenta gotas, se hace conforme a la discusion de este foro.

egostar 09-09-2008 00:07:45

Cita:

Empezado por lledesma (Mensaje 312612)
Creo que Caro es la que resumio un poco lo que no supe explicar

Pues nuestra amiguita [Caro] te lo dijo desde el post # 3 de este hilo. :confused::confused:

Cita:

Empezado por lledesma (Mensaje 312612)
La informacion no se va dando a cuenta gotas, se hace conforme a la discusion de este foro.

:rolleyes::rolleyes::rolleyes:

Salud OS

Caral 09-09-2008 01:09:01

Hola
Me canso y no me dais la solución, a ver si os apuráis.:D:D
Saludos

Caro 09-09-2008 04:59:28

Cita:

Empezado por lledesma (Mensaje 312612)
Cada cliente puede tener solo una factura por mes con cualquier tipo de condicion y sus respectivos pagos, valores negativos, estan asociados a la factura por idcliente,ano,mes.

Con cualquier tipo de condición pero no con dos o mas condiciones para el mismo mes, si he entendido bien, entoces Iledesma la ultima consulta que te puse debería funcionarte, pruebala, es esta.

Código SQL [-]
select c1.idcliente, c1.mes, c1.condicion, 
        (select sum(importe) 
         from clientes where idcliente=c1.idcliente and mes=c1.mes group by id_cliente, mes)
from clientes c1
where condicion  is not Null

Saluditos

hach 09-09-2008 13:37:44

Ya va, ya va Caral
 
Cita:

Me canso y no me dais la solución, a ver si os apuráis.:D:D
Saludos
A pedido de Caral, aca va un aporte

Se me ocurre crear un view

Código SQL [-]
CREATE VIEW CLIENTES_VIEW(
    IDCLIENTE,
    MES,
    CONDICION,
    IMPORTE)
AS
select c.idcliente, c.mes, c.condicion, c.importe
from clientes c
where c.condicion is not null
union
select c.idcliente, c.mes
, (select c2.condicion from clientes c2 where c2.condicion is not null and c2.idcliente=c.idcliente and c2.mes=c.mes)
, c.importe
from clientes c
where  c.condicion is null
;

y despues hacer el select sobre el view


Código SQL [-]
select idcliente, mes, condicion, sum(importe)
from clientes_view
group by idcliente, mes, condicion
order by idcliente, mes


Saludos

lledesma 10-09-2008 19:28:17

Muchas gracias por los aporte.

Tengo un problema con mi firebird, pero pruebo y les comento.
Gracias


La franja horaria es GMT +2. Ahora son las 02:46:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi