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

#6 luis suescun
22/09/2004 - 15:54 | Informe spam
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
#7 luis suescun
22/09/2004 - 16:06 | Informe spam
Hola Max...

la razon por la cual yo les hablo del consecutivo en la maestra de campañas,
es porque si en la resta del actual pedido-el anterior el resultado da mas
de 1, es porque la señora no puso pedido en un rango de campañas, ahora lo
que toca es analizar si ese valor es mayor o igual a 3, que es ahi donde la
señora dejo de ser activa, por lo tanto no se le cuenta como activa.
Si necesitas mas detalles, me cuentas..

Ah... y tomate tu tiempo.


Gracias.



"MAXI" wrote in message
news:
Hola, a ver, y en tu ejemplo segun vos, cuantas campañas estuvo activo el
cliente? porque hay algo que no me cierra del todo bien




Maxi

Buenos Aires - Argentina
Desarrollador .NET 3 Estrellas
Microsoft User Group (MUG)
Mail: Maxi_accotto[arroba]speedy.com.ar

Msn Messager:

"luis suescun" escribió en el mensaje
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
#8 Liliana Sorrentino
22/09/2004 - 19:37 | Informe spam
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
#9 Liliana Sorrentino
22/09/2004 - 19:49 | Informe spam
Perdón había un 'NOT' de más:

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

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


"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
#10 Liliana Sorrentino
22/09/2004 - 20:13 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida