Descartar Cursores

22/09/2004 - 01:03 por luis suescun | Informe spam
Hola Grupo...

Atendiendo la sugerencia de descartar cursores, pero analizando mi
situacion, no le veo la salida.
recurro a sus excelentes conocimientos para ver si es posible con este caso

Tengo una tabla en la que tengo la facturacion de mis clientes campaña por
campaña
Ej:

Cedula Campaña Valor
xxxxxx 200401 51212
xxxxxx 200402 212121
xxxxxx 200404 474545
xxxxxx 200407 145551

En otra tabla maestra de campañas, yo tengo un consecutivo que me permite
conocer la diferencia numerica entre una campaña y otra
Ej:

Campaña Consecutivo
200401 58
200402 59
200403 60
200404 61
200405 62
200406 63
200407 64

esto me da la posibilidad de conocer el numero de campañas transcurridas
entre un pedido y otro de cada cliente

mi necesidad es:

un informe que me diga el numero de campañas en que estuvo activa una
cliente, teniendo en cuenta que se pone inactiva cuando deja de poner pedido
durante 2 campañas. y si vuelve a poner pedido despues de 2 campañas de
inactividad, vuelve a ser activa.

Muchas Gracias a todos.

Preguntas similare

Leer las respuestas

#11 luis suescun
23/09/2004 - 01:13 | Informe spam
Mil gracias Lilianita...

Mañana lo probare y te doy detalles.

Suerte.


"Liliana Sorrentino" wrote in message
news:#Pher$
Bueno, este es el definitivo, había agregado la tercera subconsulta para


la
prueba, pero ya no es necesaria.

SELECT Cedula, Activa = SUM(CASE WHEN activa = 'si' THEN 1 ELSE 0 END)
FROM
(SELECT campaña = c.campaña, cedula = m.cedula,
activa = CASE WHEN t1.cedula IS NOT NULL THEN 'si'
WHEN t1.cedula IS NULL AND t2.cedula IS NOT NULL THEN 'si' ELSE
'no' END
FROM campanas c

CROSS JOIN (SELECT DISTINCT cedula FROM movimientos) m

LEFT JOIN (SELECT c.campaña, c.consecutivo, cedula
FROM campanas c
LEFT JOIN movimientos m1 ON m1.campaña = c.campaña) t1
ON m.cedula = t1.cedula AND c.campaña = t1.campaña

LEFT JOIN (SELECT c.campaña, c.consecutivo, cedula
FROM campanas c
LEFT JOIN movimientos m1 ON m1.campaña = c.campaña) t2
ON c.consecutivo - 1 = t2.consecutivo AND m.cedula = t2.cedula
) tabla
GROUP BY cedula

"Liliana Sorrentino" escribió en el


mensaje
news:OO#
> Hola Luis,
> Así como está armado, da el resultado esperado, pero no tengo idea del
> rendimiento si el volumen de la información es mucho o si no tenés los
> índices adecuados.
>
> La idea fue tener la tabla de Campañas, una subconsulta con las


diferentes
> Cedulas y tres subconsultas relacionadas por el número consecutivo de
> campaña.
> Espero que te sea claro, y si no es lo que necesitás, que puedas
acomodarlo.
> Saludos... Liliana.
>
> SELECT Cedula, Activa = SUM(CASE WHEN activa = 'si' THEN 1 ELSE 0 END)
> FROM
> (SELECT campaña = c.campaña, cedula = m.cedula,
> activa = CASE WHEN t1.cedula IS NOT NULL THEN 'si'
> WHEN t1.cedula IS NOT NULL AND t2.cedula IS NOT NULL THEN 'si'
ELSE
> 'no' END
> FROM campanas c
>
> CROSS JOIN (SELECT DISTINCT cedula FROM movimientos) m
>
> LEFT JOIN (SELECT c.campaña, c.consecutivo, cedula
> FROM campanas c
> LEFT JOIN movimientos m1 ON m1.campaña = c.campaña) t1
> ON m.cedula = t1.cedula AND c.campaña = t1.campaña
>
> LEFT JOIN (SELECT c.campaña, c.consecutivo, cedula
> FROM campanas c
> LEFT JOIN movimientos m1 ON m1.campaña = c.campaña) t2
> ON c.consecutivo - 1 = t2.consecutivo AND m.cedula = t2.cedula
>
> LEFT JOIN (SELECT c.campaña, c.consecutivo, cedula
> FROM campanas c
> LEFT JOIN movimientos m1 ON m1.campaña = c.campaña) t3
> ON c.consecutivo - 2 = t3.consecutivo AND m.cedula = t3.cedula)
>
> tabla
> GROUP BY cedula
>
>
> "luis suescun" escribió en el mensaje
> news:
> > Perdon Javier...
> >
> > El query tiene un problema:
> > Me esta informando pedidos de la cliente, en campañas en las que ella


no
> > tiene pedido y es justamenete una campaña antes a la campaña en que
vuelve
> a
> > poner pedido, despues de haber dejado de poner pedido.
> >
> > Esta es una muestra:
> >
> > la realidad de la señora
> >
> > cedula campaña
> > 39006449 200301 Activa
> > 39006449 200302 Activa
> > 39006449 200303 Activa
> > 39006449 200304 Activa
> > 200305 Activa
> > 200306 Inactiva
> > 39006449 200307 Activa
> > 39006449 200308 Activa
> > 39006449 200309 Activa
> > 39006449 200310 Activa
> > 200311 Activa
> > 200312 Inactiva
> > 200313 Inactiva
> > 200314 Inactiva
> > 39006449 200315 Activa
> > 200316 Activa
> > 39006449 200317 Activa
> > 200318 Activa
> > 39006449 200401 Activa
> > 200402 Activa
> > 39006449 200403 Activa
> > 200404 Activa
> > 39006449 200405 Activa
> > 39006449 200406 Activa
> > 39006449 200407 Activa
> > 39006449 200408 Activa
> > 200409 Activa
> > 39006449 200410 Activa
> > 39006449 200411 Activa
> > 200412 Activa
> > 39006449 200413 Activa
> >
> > Como puedes ver, esta cliente puso 19 pedidos en un rango de 31
campañas,
> > pero ella es activa durante 27 campañas.
> > Los registros sin cedula, son las campañas en las cuales la cliente no
> puso
> > pedido, pero solo cuando ella alcanza un minimo de 2 campañas
consecutivas
> > sin poner pedido, se vuelve inactiva.
> > mi problema, es saber el numero de campañas en que estuvo activa
> >
> >
> > El query
> > 00039006449 200218
> > 00039006449 200301
> > 00039006449 200302
> > 00039006449 200303
> > 00039006449 200304
> > 00039006449 200306
> > 00039006449 200307
> > 00039006449 200308
> > 00039006449 200309
> > 00039006449 200310
> > 00039006449 200314
> > 00039006449 200315
> > 00039006449 200316
> > 00039006449 200317
> > 00039006449 200318
> > 00039006449 200401
> > 00039006449 200402
> > 00039006449 200403
> > 00039006449 200404
> > 00039006449 200405
> > 00039006449 200406
> > 00039006449 200407
> > 00039006449 200408
> > 00039006449 200409
> > 00039006449 200410
> > 00039006449 200411
> > 00039006449 200412
> > 00039006449 200413
> >
> > De todas formas Javier, yo entiendo que este es un caso bastante
especial,
> > al menos para mi, si consideras que aun se puede reemplazar los


cursores
> por
> > consultas, te doy mis felicitaciones de antemano.
> >
> >
> > "Javier Loria" wrote in message
> > news:u$
> > > Hola Luis:
> > > La siguiente consulta debe dar las campanas en que una cliente
esta
> > > "activa"
> > > > > > > SELECT DISTINCT Facturacion.Cedula, A.Campana
> > > FROM Campanas AS A
> > > JOIN Campanas AS B
> > > ON A.Consecutivo=B.Consecutivo-1
> > > JOIN Facturacion
> > > ON Facturacion.Campana=A.Campana
> > > OR Facturacion.Campana=B.Campana
> > > > > > > La cantidad de campanas activas debe ser:
> > > > > > > SELECT Cedula, COUNT(*)
> > > FROM (SELECT DISTINCT Facturacion.Cedula, A.Campana
> > > FROM Campanas AS A
> > > JOIN Campanas AS B
> > > ON A.Consecutivo=B.Consecutivo-1
> > > JOIN Facturacion
> > > ON Facturacion.Campana=A.Campana
> > > OR Facturacion.Campana=B.Campana) AS Camp
> > > GROUP BY Cedula
> > > > > > > Trate de hacerlo mas simple, pero a esta hora ya no me da la
cabeza.
> > > Espero que no tenga problemas de sintaxis.
> > > Suerte,
> > >
> > >
> > > Javier Loria
> > > Costa Rica
> > > Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
> > > que pueda ser copiado y pegado al Query Analizer.
> > > La version de SQL y Service Pack tambien ayuda
> > >
> > > "luis suescun" wrote in message
> > > news:
> > > > Hola Grupo...
> > > >
> > > > Atendiendo la sugerencia de descartar cursores, pero analizando mi
> > > > situacion, no le veo la salida.
> > > > recurro a sus excelentes conocimientos para ver si es posible con
este
> > > caso
> > > >
> > > > Tengo una tabla en la que tengo la facturacion de mis clientes
campaña
> > por
> > > > campaña
> > > > Ej:
> > > >
> > > > Cedula Campaña Valor
> > > > xxxxxx 200401 51212
> > > > xxxxxx 200402 212121
> > > > xxxxxx 200404 474545
> > > > xxxxxx 200407 145551
> > > >
> > > > En otra tabla maestra de campañas, yo tengo un consecutivo que me
> > permite
> > > > conocer la diferencia numerica entre una campaña y otra
> > > > Ej:
> > > >
> > > > Campaña Consecutivo
> > > > 200401 58
> > > > 200402 59
> > > > 200403 60
> > > > 200404 61
> > > > 200405 62
> > > > 200406 63
> > > > 200407 64
> > > >
> > > > esto me da la posibilidad de conocer el numero de campañas
> transcurridas
> > > > entre un pedido y otro de cada cliente
> > > >
> > > > mi necesidad es:
> > > >
> > > > un informe que me diga el numero de campañas en que estuvo activa
una
> > > > cliente, teniendo en cuenta que se pone inactiva cuando deja de
poner
> > > pedido
> > > > durante 2 campañas. y si vuelve a poner pedido despues de 2


campañas
> de
> > > > inactividad, vuelve a ser activa.
> > > >
> > > > Muchas Gracias a todos.
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#12 Javier Loria
23/09/2004 - 15:18 | Informe spam
Hola:
Si claro, ya entedi el problema del mi query.
Entonces prueba esto:
=SELECT Facturacion.Cedula
,B.Campana
FROM Campanas AS A
JOIN Campanas AS B
ON A.Consecutivo=B.Consecutivo-1
JOIN Facturacion
ON Facturacion.Campana=A.Campana
OR Facturacion.Campana=B.Campana
UNION
SELECT Facturacion.Cedula
,Facturacion.Campana
FROM Facturacion

= Esto te da las campanas activas de una cliente y si lo anidas en un
Group by
=SELECT Cedula
, COUNT(*)
FROM (.) AS Camp
GROUP BY Cedula
= Espero te sirva, durante el dia voy a echarle un ojo al mecanismo que
uso Lilliana, porque siempre se aprende mucho del codigo que escribe.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"luis suescun" wrote in message
news:
Perdon Javier...

El query tiene un problema:
Me esta informando pedidos de la cliente, en campañas en las que ella no
tiene pedido y es justamenete una campaña antes a la campaña en que vuelve


a
poner pedido, despues de haber dejado de poner pedido.

Esta es una muestra:

la realidad de la señora

cedula campaña
39006449 200301 Activa
39006449 200302 Activa
39006449 200303 Activa
39006449 200304 Activa
200305 Activa
200306 Inactiva
39006449 200307 Activa
39006449 200308 Activa
39006449 200309 Activa
39006449 200310 Activa
200311 Activa
200312 Inactiva
200313 Inactiva
200314 Inactiva
39006449 200315 Activa
200316 Activa
39006449 200317 Activa
200318 Activa
39006449 200401 Activa
200402 Activa
39006449 200403 Activa
200404 Activa
39006449 200405 Activa
39006449 200406 Activa
39006449 200407 Activa
39006449 200408 Activa
200409 Activa
39006449 200410 Activa
39006449 200411 Activa
200412 Activa
39006449 200413 Activa

Como puedes ver, esta cliente puso 19 pedidos en un rango de 31 campañas,
pero ella es activa durante 27 campañas.
Los registros sin cedula, son las campañas en las cuales la cliente no


puso
pedido, pero solo cuando ella alcanza un minimo de 2 campañas consecutivas
sin poner pedido, se vuelve inactiva.
mi problema, es saber el numero de campañas en que estuvo activa


El query
00039006449 200218
00039006449 200301
00039006449 200302
00039006449 200303
00039006449 200304
00039006449 200306
00039006449 200307
00039006449 200308
00039006449 200309
00039006449 200310
00039006449 200314
00039006449 200315
00039006449 200316
00039006449 200317
00039006449 200318
00039006449 200401
00039006449 200402
00039006449 200403
00039006449 200404
00039006449 200405
00039006449 200406
00039006449 200407
00039006449 200408
00039006449 200409
00039006449 200410
00039006449 200411
00039006449 200412
00039006449 200413

De todas formas Javier, yo entiendo que este es un caso bastante especial,
al menos para mi, si consideras que aun se puede reemplazar los cursores


por
consultas, te doy mis felicitaciones de antemano.


"Javier Loria" wrote in message
news:u$
> Hola Luis:
> La siguiente consulta debe dar las campanas en que una cliente esta
> "activa"
> > > SELECT DISTINCT Facturacion.Cedula, A.Campana
> FROM Campanas AS A
> JOIN Campanas AS B
> ON A.Consecutivo=B.Consecutivo-1
> JOIN Facturacion
> ON Facturacion.Campana=A.Campana
> OR Facturacion.Campana=B.Campana
> > > La cantidad de campanas activas debe ser:
> > > SELECT Cedula, COUNT(*)
> FROM (SELECT DISTINCT Facturacion.Cedula, A.Campana
> FROM Campanas AS A
> JOIN Campanas AS B
> ON A.Consecutivo=B.Consecutivo-1
> JOIN Facturacion
> ON Facturacion.Campana=A.Campana
> OR Facturacion.Campana=B.Campana) AS Camp
> GROUP BY Cedula
> > > Trate de hacerlo mas simple, pero a esta hora ya no me da la cabeza.
> Espero que no tenga problemas de sintaxis.
> Suerte,
>
>
> Javier Loria
> Costa Rica
> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
> que pueda ser copiado y pegado al Query Analizer.
> La version de SQL y Service Pack tambien ayuda
>
> "luis suescun" wrote in message
> news:
> > Hola Grupo...
> >
> > Atendiendo la sugerencia de descartar cursores, pero analizando mi
> > situacion, no le veo la salida.
> > recurro a sus excelentes conocimientos para ver si es posible con este
> caso
> >
> > Tengo una tabla en la que tengo la facturacion de mis clientes campaña
por
> > campaña
> > Ej:
> >
> > Cedula Campaña Valor
> > xxxxxx 200401 51212
> > xxxxxx 200402 212121
> > xxxxxx 200404 474545
> > xxxxxx 200407 145551
> >
> > En otra tabla maestra de campañas, yo tengo un consecutivo que me
permite
> > conocer la diferencia numerica entre una campaña y otra
> > Ej:
> >
> > Campaña Consecutivo
> > 200401 58
> > 200402 59
> > 200403 60
> > 200404 61
> > 200405 62
> > 200406 63
> > 200407 64
> >
> > esto me da la posibilidad de conocer el numero de campañas


transcurridas
> > entre un pedido y otro de cada cliente
> >
> > mi necesidad es:
> >
> > un informe que me diga el numero de campañas en que estuvo activa una
> > cliente, teniendo en cuenta que se pone inactiva cuando deja de poner
> pedido
> > durante 2 campañas. y si vuelve a poner pedido despues de 2 campañas


de
> > inactividad, vuelve a ser activa.
> >
> > Muchas Gracias a todos.
> >
> >
> >
> >
> >
> >
>
>


Respuesta Responder a este mensaje
#13 Liliana Sorrentino
23/09/2004 - 16:24 | Informe spam
¡Sin palabras!
Otro más para la carpeta de "Especiales"

"Javier Loria" escribió en el mensaje
news:OchQK$
Hola:
Si claro, ya entedi el problema del mi query.
Entonces prueba esto:
=> SELECT Facturacion.Cedula
,B.Campana
FROM Campanas AS A
JOIN Campanas AS B
ON A.Consecutivo=B.Consecutivo-1
JOIN Facturacion
ON Facturacion.Campana=A.Campana
OR Facturacion.Campana=B.Campana
UNION
SELECT Facturacion.Cedula
,Facturacion.Campana
FROM Facturacion

=> Esto te da las campanas activas de una cliente y si lo anidas en un
Group by
=> SELECT Cedula
, COUNT(*)
FROM (.) AS Camp
GROUP BY Cedula
=> Espero te sirva, durante el dia voy a echarle un ojo al mecanismo que
uso Lilliana, porque siempre se aprende mucho del codigo que escribe.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"luis suescun" wrote in message
news:
> Perdon Javier...
>
> El query tiene un problema:
> Me esta informando pedidos de la cliente, en campañas en las que ella no
> tiene pedido y es justamenete una campaña antes a la campaña en que


vuelve
a
> poner pedido, despues de haber dejado de poner pedido.
>
> Esta es una muestra:
>
> la realidad de la señora
>
> cedula campaña
> 39006449 200301 Activa
> 39006449 200302 Activa
> 39006449 200303 Activa
> 39006449 200304 Activa
> 200305 Activa
> 200306 Inactiva
> 39006449 200307 Activa
> 39006449 200308 Activa
> 39006449 200309 Activa
> 39006449 200310 Activa
> 200311 Activa
> 200312 Inactiva
> 200313 Inactiva
> 200314 Inactiva
> 39006449 200315 Activa
> 200316 Activa
> 39006449 200317 Activa
> 200318 Activa
> 39006449 200401 Activa
> 200402 Activa
> 39006449 200403 Activa
> 200404 Activa
> 39006449 200405 Activa
> 39006449 200406 Activa
> 39006449 200407 Activa
> 39006449 200408 Activa
> 200409 Activa
> 39006449 200410 Activa
> 39006449 200411 Activa
> 200412 Activa
> 39006449 200413 Activa
>
> Como puedes ver, esta cliente puso 19 pedidos en un rango de 31


campañas,
> pero ella es activa durante 27 campañas.
> Los registros sin cedula, son las campañas en las cuales la cliente no
puso
> pedido, pero solo cuando ella alcanza un minimo de 2 campañas


consecutivas
> sin poner pedido, se vuelve inactiva.
> mi problema, es saber el numero de campañas en que estuvo activa
>
>
> El query
> 00039006449 200218
> 00039006449 200301
> 00039006449 200302
> 00039006449 200303
> 00039006449 200304
> 00039006449 200306
> 00039006449 200307
> 00039006449 200308
> 00039006449 200309
> 00039006449 200310
> 00039006449 200314
> 00039006449 200315
> 00039006449 200316
> 00039006449 200317
> 00039006449 200318
> 00039006449 200401
> 00039006449 200402
> 00039006449 200403
> 00039006449 200404
> 00039006449 200405
> 00039006449 200406
> 00039006449 200407
> 00039006449 200408
> 00039006449 200409
> 00039006449 200410
> 00039006449 200411
> 00039006449 200412
> 00039006449 200413
>
> De todas formas Javier, yo entiendo que este es un caso bastante


especial,
> al menos para mi, si consideras que aun se puede reemplazar los cursores
por
> consultas, te doy mis felicitaciones de antemano.
>
>
> "Javier Loria" wrote in message
> news:u$
> > Hola Luis:
> > La siguiente consulta debe dar las campanas en que una cliente


esta
> > "activa"
> > > > > SELECT DISTINCT Facturacion.Cedula, A.Campana
> > FROM Campanas AS A
> > JOIN Campanas AS B
> > ON A.Consecutivo=B.Consecutivo-1
> > JOIN Facturacion
> > ON Facturacion.Campana=A.Campana
> > OR Facturacion.Campana=B.Campana
> > > > > La cantidad de campanas activas debe ser:
> > > > > SELECT Cedula, COUNT(*)
> > FROM (SELECT DISTINCT Facturacion.Cedula, A.Campana
> > FROM Campanas AS A
> > JOIN Campanas AS B
> > ON A.Consecutivo=B.Consecutivo-1
> > JOIN Facturacion
> > ON Facturacion.Campana=A.Campana
> > OR Facturacion.Campana=B.Campana) AS Camp
> > GROUP BY Cedula
> > > > > Trate de hacerlo mas simple, pero a esta hora ya no me da la


cabeza.
> > Espero que no tenga problemas de sintaxis.
> > Suerte,
> >
> >
> > Javier Loria
> > Costa Rica
> > Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
> > que pueda ser copiado y pegado al Query Analizer.
> > La version de SQL y Service Pack tambien ayuda
> >
> > "luis suescun" wrote in message
> > news:
> > > Hola Grupo...
> > >
> > > Atendiendo la sugerencia de descartar cursores, pero analizando mi
> > > situacion, no le veo la salida.
> > > recurro a sus excelentes conocimientos para ver si es posible con


este
> > caso
> > >
> > > Tengo una tabla en la que tengo la facturacion de mis clientes


campaña
> por
> > > campaña
> > > Ej:
> > >
> > > Cedula Campaña Valor
> > > xxxxxx 200401 51212
> > > xxxxxx 200402 212121
> > > xxxxxx 200404 474545
> > > xxxxxx 200407 145551
> > >
> > > En otra tabla maestra de campañas, yo tengo un consecutivo que me
> permite
> > > conocer la diferencia numerica entre una campaña y otra
> > > Ej:
> > >
> > > Campaña Consecutivo
> > > 200401 58
> > > 200402 59
> > > 200403 60
> > > 200404 61
> > > 200405 62
> > > 200406 63
> > > 200407 64
> > >
> > > esto me da la posibilidad de conocer el numero de campañas
transcurridas
> > > entre un pedido y otro de cada cliente
> > >
> > > mi necesidad es:
> > >
> > > un informe que me diga el numero de campañas en que estuvo activa


una
> > > cliente, teniendo en cuenta que se pone inactiva cuando deja de


poner
> > pedido
> > > durante 2 campañas. y si vuelve a poner pedido despues de 2 campañas
de
> > > inactividad, vuelve a ser activa.
> > >
> > > Muchas Gracias a todos.
> > >
> > >
> > >
> > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#14 luis suescun
23/09/2004 - 19:20 | Informe spam
Hola Javier

Si, en un principio yo no fui muy explicito y talves debido a eso tu primer
query no se acomoda, pero voy a probar este otro y te cuento...

Felicitaciones y un abrazo.


"Liliana Sorrentino" wrote in message
news:
¡Sin palabras!
Otro más para la carpeta de "Especiales"

"Javier Loria" escribió en el mensaje
news:OchQK$
> Hola:
> Si claro, ya entedi el problema del mi query.
> Entonces prueba esto:
> => > SELECT Facturacion.Cedula
> ,B.Campana
> FROM Campanas AS A
> JOIN Campanas AS B
> ON A.Consecutivo=B.Consecutivo-1
> JOIN Facturacion
> ON Facturacion.Campana=A.Campana
> OR Facturacion.Campana=B.Campana
> UNION
> SELECT Facturacion.Cedula
> ,Facturacion.Campana
> FROM Facturacion
>
> => > Esto te da las campanas activas de una cliente y si lo anidas en un
> Group by
> => > SELECT Cedula
> , COUNT(*)
> FROM (.) AS Camp
> GROUP BY Cedula
> => > Espero te sirva, durante el dia voy a echarle un ojo al mecanismo


que
> uso Lilliana, porque siempre se aprende mucho del codigo que escribe.
> Saludos,
>
> Javier Loria
> Costa Rica
> Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
> que pueda ser copiado y pegado al Query Analizer.
> La version de SQL y Service Pack tambien ayuda
>
> "luis suescun" wrote in message
> news:
> > Perdon Javier...
> >
> > El query tiene un problema:
> > Me esta informando pedidos de la cliente, en campañas en las que ella


no
> > tiene pedido y es justamenete una campaña antes a la campaña en que
vuelve
> a
> > poner pedido, despues de haber dejado de poner pedido.
> >
> > Esta es una muestra:
> >
> > la realidad de la señora
> >
> > cedula campaña
> > 39006449 200301 Activa
> > 39006449 200302 Activa
> > 39006449 200303 Activa
> > 39006449 200304 Activa
> > 200305 Activa
> > 200306 Inactiva
> > 39006449 200307 Activa
> > 39006449 200308 Activa
> > 39006449 200309 Activa
> > 39006449 200310 Activa
> > 200311 Activa
> > 200312 Inactiva
> > 200313 Inactiva
> > 200314 Inactiva
> > 39006449 200315 Activa
> > 200316 Activa
> > 39006449 200317 Activa
> > 200318 Activa
> > 39006449 200401 Activa
> > 200402 Activa
> > 39006449 200403 Activa
> > 200404 Activa
> > 39006449 200405 Activa
> > 39006449 200406 Activa
> > 39006449 200407 Activa
> > 39006449 200408 Activa
> > 200409 Activa
> > 39006449 200410 Activa
> > 39006449 200411 Activa
> > 200412 Activa
> > 39006449 200413 Activa
> >
> > Como puedes ver, esta cliente puso 19 pedidos en un rango de 31
campañas,
> > pero ella es activa durante 27 campañas.
> > Los registros sin cedula, son las campañas en las cuales la cliente no
> puso
> > pedido, pero solo cuando ella alcanza un minimo de 2 campañas
consecutivas
> > sin poner pedido, se vuelve inactiva.
> > mi problema, es saber el numero de campañas en que estuvo activa
> >
> >
> > El query
> > 00039006449 200218
> > 00039006449 200301
> > 00039006449 200302
> > 00039006449 200303
> > 00039006449 200304
> > 00039006449 200306
> > 00039006449 200307
> > 00039006449 200308
> > 00039006449 200309
> > 00039006449 200310
> > 00039006449 200314
> > 00039006449 200315
> > 00039006449 200316
> > 00039006449 200317
> > 00039006449 200318
> > 00039006449 200401
> > 00039006449 200402
> > 00039006449 200403
> > 00039006449 200404
> > 00039006449 200405
> > 00039006449 200406
> > 00039006449 200407
> > 00039006449 200408
> > 00039006449 200409
> > 00039006449 200410
> > 00039006449 200411
> > 00039006449 200412
> > 00039006449 200413
> >
> > De todas formas Javier, yo entiendo que este es un caso bastante
especial,
> > al menos para mi, si consideras que aun se puede reemplazar los


cursores
> por
> > consultas, te doy mis felicitaciones de antemano.
> >
> >
> > "Javier Loria" wrote in message
> > news:u$
> > > Hola Luis:
> > > La siguiente consulta debe dar las campanas en que una cliente
esta
> > > "activa"
> > > > > > > SELECT DISTINCT Facturacion.Cedula, A.Campana
> > > FROM Campanas AS A
> > > JOIN Campanas AS B
> > > ON A.Consecutivo=B.Consecutivo-1
> > > JOIN Facturacion
> > > ON Facturacion.Campana=A.Campana
> > > OR Facturacion.Campana=B.Campana
> > > > > > > La cantidad de campanas activas debe ser:
> > > > > > > SELECT Cedula, COUNT(*)
> > > FROM (SELECT DISTINCT Facturacion.Cedula, A.Campana
> > > FROM Campanas AS A
> > > JOIN Campanas AS B
> > > ON A.Consecutivo=B.Consecutivo-1
> > > JOIN Facturacion
> > > ON Facturacion.Campana=A.Campana
> > > OR Facturacion.Campana=B.Campana) AS Camp
> > > GROUP BY Cedula
> > > > > > > Trate de hacerlo mas simple, pero a esta hora ya no me da la
cabeza.
> > > Espero que no tenga problemas de sintaxis.
> > > Suerte,
> > >
> > >
> > > Javier Loria
> > > Costa Rica
> > > Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
> > > que pueda ser copiado y pegado al Query Analizer.
> > > La version de SQL y Service Pack tambien ayuda
> > >
> > > "luis suescun" wrote in message
> > > news:
> > > > Hola Grupo...
> > > >
> > > > Atendiendo la sugerencia de descartar cursores, pero analizando mi
> > > > situacion, no le veo la salida.
> > > > recurro a sus excelentes conocimientos para ver si es posible con
este
> > > caso
> > > >
> > > > Tengo una tabla en la que tengo la facturacion de mis clientes
campaña
> > por
> > > > campaña
> > > > Ej:
> > > >
> > > > Cedula Campaña Valor
> > > > xxxxxx 200401 51212
> > > > xxxxxx 200402 212121
> > > > xxxxxx 200404 474545
> > > > xxxxxx 200407 145551
> > > >
> > > > En otra tabla maestra de campañas, yo tengo un consecutivo que me
> > permite
> > > > conocer la diferencia numerica entre una campaña y otra
> > > > Ej:
> > > >
> > > > Campaña Consecutivo
> > > > 200401 58
> > > > 200402 59
> > > > 200403 60
> > > > 200404 61
> > > > 200405 62
> > > > 200406 63
> > > > 200407 64
> > > >
> > > > esto me da la posibilidad de conocer el numero de campañas
> transcurridas
> > > > entre un pedido y otro de cada cliente
> > > >
> > > > mi necesidad es:
> > > >
> > > > un informe que me diga el numero de campañas en que estuvo activa
una
> > > > cliente, teniendo en cuenta que se pone inactiva cuando deja de
poner
> > > pedido
> > > > durante 2 campañas. y si vuelve a poner pedido despues de 2


campañas
> de
> > > > inactividad, vuelve a ser activa.
> > > >
> > > > Muchas Gracias a todos.
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#15 luis suescun
23/09/2004 - 21:40 | Informe spam
Si javier...

Esta perfecto, Felicitaciones Hermano.

Ustedes son Excelentes.


"Javier Loria" wrote in message
news:OchQK$
Hola:
Si claro, ya entedi el problema del mi query.
Entonces prueba esto:
=> SELECT Facturacion.Cedula
,B.Campana
FROM Campanas AS A
JOIN Campanas AS B
ON A.Consecutivo=B.Consecutivo-1
JOIN Facturacion
ON Facturacion.Campana=A.Campana
OR Facturacion.Campana=B.Campana
UNION
SELECT Facturacion.Cedula
,Facturacion.Campana
FROM Facturacion

=> Esto te da las campanas activas de una cliente y si lo anidas en un
Group by
=> SELECT Cedula
, COUNT(*)
FROM (.) AS Camp
GROUP BY Cedula
=> Espero te sirva, durante el dia voy a echarle un ojo al mecanismo que
uso Lilliana, porque siempre se aprende mucho del codigo que escribe.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda

"luis suescun" wrote in message
news:
> Perdon Javier...
>
> El query tiene un problema:
> Me esta informando pedidos de la cliente, en campañas en las que ella no
> tiene pedido y es justamenete una campaña antes a la campaña en que


vuelve
a
> poner pedido, despues de haber dejado de poner pedido.
>
> Esta es una muestra:
>
> la realidad de la señora
>
> cedula campaña
> 39006449 200301 Activa
> 39006449 200302 Activa
> 39006449 200303 Activa
> 39006449 200304 Activa
> 200305 Activa
> 200306 Inactiva
> 39006449 200307 Activa
> 39006449 200308 Activa
> 39006449 200309 Activa
> 39006449 200310 Activa
> 200311 Activa
> 200312 Inactiva
> 200313 Inactiva
> 200314 Inactiva
> 39006449 200315 Activa
> 200316 Activa
> 39006449 200317 Activa
> 200318 Activa
> 39006449 200401 Activa
> 200402 Activa
> 39006449 200403 Activa
> 200404 Activa
> 39006449 200405 Activa
> 39006449 200406 Activa
> 39006449 200407 Activa
> 39006449 200408 Activa
> 200409 Activa
> 39006449 200410 Activa
> 39006449 200411 Activa
> 200412 Activa
> 39006449 200413 Activa
>
> Como puedes ver, esta cliente puso 19 pedidos en un rango de 31


campañas,
> pero ella es activa durante 27 campañas.
> Los registros sin cedula, son las campañas en las cuales la cliente no
puso
> pedido, pero solo cuando ella alcanza un minimo de 2 campañas


consecutivas
> sin poner pedido, se vuelve inactiva.
> mi problema, es saber el numero de campañas en que estuvo activa
>
>
> El query
> 00039006449 200218
> 00039006449 200301
> 00039006449 200302
> 00039006449 200303
> 00039006449 200304
> 00039006449 200306
> 00039006449 200307
> 00039006449 200308
> 00039006449 200309
> 00039006449 200310
> 00039006449 200314
> 00039006449 200315
> 00039006449 200316
> 00039006449 200317
> 00039006449 200318
> 00039006449 200401
> 00039006449 200402
> 00039006449 200403
> 00039006449 200404
> 00039006449 200405
> 00039006449 200406
> 00039006449 200407
> 00039006449 200408
> 00039006449 200409
> 00039006449 200410
> 00039006449 200411
> 00039006449 200412
> 00039006449 200413
>
> De todas formas Javier, yo entiendo que este es un caso bastante


especial,
> al menos para mi, si consideras que aun se puede reemplazar los cursores
por
> consultas, te doy mis felicitaciones de antemano.
>
>
> "Javier Loria" wrote in message
> news:u$
> > Hola Luis:
> > La siguiente consulta debe dar las campanas en que una cliente


esta
> > "activa"
> > > > > SELECT DISTINCT Facturacion.Cedula, A.Campana
> > FROM Campanas AS A
> > JOIN Campanas AS B
> > ON A.Consecutivo=B.Consecutivo-1
> > JOIN Facturacion
> > ON Facturacion.Campana=A.Campana
> > OR Facturacion.Campana=B.Campana
> > > > > La cantidad de campanas activas debe ser:
> > > > > SELECT Cedula, COUNT(*)
> > FROM (SELECT DISTINCT Facturacion.Cedula, A.Campana
> > FROM Campanas AS A
> > JOIN Campanas AS B
> > ON A.Consecutivo=B.Consecutivo-1
> > JOIN Facturacion
> > ON Facturacion.Campana=A.Campana
> > OR Facturacion.Campana=B.Campana) AS Camp
> > GROUP BY Cedula
> > > > > Trate de hacerlo mas simple, pero a esta hora ya no me da la


cabeza.
> > Espero que no tenga problemas de sintaxis.
> > Suerte,
> >
> >
> > Javier Loria
> > Costa Rica
> > Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
> > que pueda ser copiado y pegado al Query Analizer.
> > La version de SQL y Service Pack tambien ayuda
> >
> > "luis suescun" wrote in message
> > news:
> > > Hola Grupo...
> > >
> > > Atendiendo la sugerencia de descartar cursores, pero analizando mi
> > > situacion, no le veo la salida.
> > > recurro a sus excelentes conocimientos para ver si es posible con


este
> > caso
> > >
> > > Tengo una tabla en la que tengo la facturacion de mis clientes


campaña
> por
> > > campaña
> > > Ej:
> > >
> > > Cedula Campaña Valor
> > > xxxxxx 200401 51212
> > > xxxxxx 200402 212121
> > > xxxxxx 200404 474545
> > > xxxxxx 200407 145551
> > >
> > > En otra tabla maestra de campañas, yo tengo un consecutivo que me
> permite
> > > conocer la diferencia numerica entre una campaña y otra
> > > Ej:
> > >
> > > Campaña Consecutivo
> > > 200401 58
> > > 200402 59
> > > 200403 60
> > > 200404 61
> > > 200405 62
> > > 200406 63
> > > 200407 64
> > >
> > > esto me da la posibilidad de conocer el numero de campañas
transcurridas
> > > entre un pedido y otro de cada cliente
> > >
> > > mi necesidad es:
> > >
> > > un informe que me diga el numero de campañas en que estuvo activa


una
> > > cliente, teniendo en cuenta que se pone inactiva cuando deja de


poner
> > pedido
> > > durante 2 campañas. y si vuelve a poner pedido despues de 2 campañas
de
> > > inactividad, vuelve a ser activa.
> > >
> > > Muchas Gracias a todos.
> > >
> > >
> > >
> > >
> > >
> > >
> >
> >
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida