Unión condicional

22/07/2004 - 20:28 por Liliana Sorrentino | Informe spam
Hola a todos,

Necesito unir el resultado de varios select, pero la consulta a una de las
tablas está condicionada por el valor de un parámetro y no encuentro la
forma sin tener que caer en un query dinámico.
El caso MUUUUUY simplificado es:

SELECT t1.año, deuda_origen = t1.deuda, deuda_actual = t1.deuda *
ind.coeficiente
FROM t1 INNER JOIN ind ON t1.año = ind.año
UNION
SELECT t2.año, deuda_origen = t2.deuda, deuda_actual = t2.deuda *
ind.coeficiente
FROM t2 INNER JOIN ind ON t2.año = ind.año
UNION
IF @parametro < valor
SELECT t3.año, deuda_origen = t3.deuda, deuda_actual = t3.deuda *
ind.coeficiente
FROM t3 INNER JOIN ind ON t3.año = ind.año
ELSE
SELECT t3.año, deuda_origen = t3.deuda, deuda_actual = t3.deuda *
otroind.coeficiente
FROM t3 INNER JOIN otroind ON t3.año = otro.año

Les agradezco cualquier sugerencia,
Liliana.

Preguntas similare

Leer las respuestas

#6 Liliana Sorrentino
23/07/2004 - 20:22 | Informe spam
Hola Javier,
Gracias por tu propuesta, estoy trabajando en algo parecido a esto.
El lunes espero tener esto terminado y armo un juego de prueba con el query
real y lo expongo para que lo mires, verás que el ejemplo fue tal vez
DEMASIADO simplificado.
Gracias por tu tiempo.
Cariños... Liliana.

"Javier Loria" escribió en el mensaje
news:
Hola Liliana:
He estado dandole vuelta a la consulta y no he logrado una conclusion
sobre consulta siguiente (tengo serias dudas), pero crees que podrias


probar
algo como esto:
==> SELECT Ts.año
, Ts.Deuda_Origen
, Ts.deuda * ind.coeficiente AS deuda_actual
(SELECT T1.año, T1.deuda AS Deuda_Origen
FROM T1
UNION -- ALL ?
SELECT T2.año, T2.deuda
FROM T2
UNION -- ALL ?
SELECT T3.año, T3.deuda
FROM T3
WHERE @Parametro<Valor) AS Ts
INNER JOIN Ind
ON Ts=Ind.año
UNION -- ALL ?
SELECT t3.año
, t3.deuda
, t3.deuda * otroind.coeficiente
FROM t3
INNER JOIN otroind
ON t3.año = otro.año
WHERE @Parametro>=Valor
==> Existe el riesgo de generar mayores costos de compilacion ya que el


plan
de acceso varia sustancialmente dependiendo de si @Parametro es mayor o
menos a Valor.
Espero te sirva,


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.

Liliana Sorrentino escribio:
> Hola Manuel,
> Gracias por la sugerencia.
> En realidad, mi problema era la relación de las tablas más que la
> recuperación de la información, o sea los índices en este caso. No
> encontraba la forma, pero adaptando la respuesta a mis necesidades
> funciona perfecto.
> Haciendo la prueba comparando lo tuyo con la solución de Ulises, no
> hay diferencia en el plan de ejecución, el costo de la consulta es el
> mismo. Gracias por el interés,
> Liliana.
>
> "Manuel Etcheto" escribió en el
> mensaje news:2d6201c470cd$675e5ae0$
> Hola
> ¿no te sirve un simple CASE en el segundo factor del
> producto?
> SELECT t3.año, deuda_origen = t3.deuda, deuda_actual > > t3.deuda * CASE WHEN @parametro < @valor
> THEN ind.coeficiente ELSE otroind.coeficiente END
>
> Saludos
> Manuel
>
>
>
>
>> Perfecto Ulises! Disculpame la tardanza, pero estaba
> chequeando todas las
>> posibilidades antes de contestarte.
>> Muchísimas gracias...
>> Liliana.
>>
>> "ulises" escribió en el
> mensaje
>> news:235f01c4701b$d3040360$
>> Hola Liliana,
>>
>> Creo que podrias reemplazar el IF con un JOIN entre ind y
>> otroind, algo como :
>>
>> SELECT t3.año,
>> deuda_origen = t3.deuda,
>> deuda_actual = t3.deuda * i.indicador
>> FROM t3
>> INNER
>> JOIN
>> ( SELECT ind.año,
>> ( CASE WHEN @parametro < @valor
>> THEN ind.coeficiente
>> ELSE otroind.coeficiente
>> END ) as indicador
>> FROM ind JOIN otroind ON ind.año = otroind.año ) i
>> ON t3.año = i.año
>>
>> Saludos,
>> Ulises
>>
>>> Hola a todos,
>>>
>>> Necesito unir el resultado de varios select, pero la
>> consulta a una de las
>>> tablas está condicionada por el valor de un parámetro y
>> no encuentro la
>>> forma sin tener que caer en un query dinámico.
>>> El caso MUUUUUY simplificado es:
>>>
>>> SELECT t1.año, deuda_origen = t1.deuda, deuda_actual > >> t1.deuda *
>>> ind.coeficiente
>>> FROM t1 INNER JOIN ind ON t1.año = ind.año
>>> UNION
>>> SELECT t2.año, deuda_origen = t2.deuda, deuda_actual > >> t2.deuda *
>>> ind.coeficiente
>>> FROM t2 INNER JOIN ind ON t2.año = ind.año
>>> UNION
>> descriptivo
>>> IF @parametro < valor
>>> SELECT t3.año, deuda_origen = t3.deuda, deuda_actual > >> t3.deuda *
>>> ind.coeficiente
>>> FROM t3 INNER JOIN ind ON t3.año = ind.año
>>> ELSE
>>> SELECT t3.año, deuda_origen = t3.deuda, deuda_actual > >> t3.deuda *
>>> otroind.coeficiente
>>> FROM t3 INNER JOIN otroind ON t3.año = otro.año
>>>
>>> Les agradezco cualquier sugerencia,
>>> Liliana.
>>>
>>>
>>>
>>> .
>>>
>>
>>
>> .


Respuesta Responder a este mensaje
#7 Manuel Etcheto
26/07/2004 - 15:48 | Informe spam
Hola Liliana

Bueno, mi sugerencia se completaba con 2 LEFT JOIN,
supongo así lo has hecho.

De todas maneras, según veo tu consulta es mucho más
extensa...
Si como imagino, eso se limita a los últimos 10 años, y
hay muchas llamadas similares, quizá puedas declarar una
tablita al comienzo de SP, llenarla con todos los datos
(anyo, coef1, coef2) y luego hacer los CASE y 1 solo JOIN
para todas las UNION contra esa "tablita matriz"

Salu2
Manuel

Hola Manuel,
Gracias por la sugerencia.
En realidad, mi problema era la relación de las tablas


más que la
recuperación de la información, o sea los índices en este


caso. No
encontraba la forma, pero adaptando la respuesta a mis


necesidades funciona
perfecto.
Haciendo la prueba comparando lo tuyo con la solución de


Ulises, no hay
diferencia en el plan de ejecución, el costo de la


consulta es el mismo.
Gracias por el interés,
Liliana.

"Manuel Etcheto"


escribió en el
mensaje news:2d6201c470cd$675e5ae0$
Hola
¿no te sirve un simple CASE en el segundo factor del
producto?
SELECT t3.año, deuda_origen = t3.deuda, deuda_actual >t3.deuda * CASE WHEN @parametro < @valor
THEN ind.coeficiente ELSE otroind.coeficiente END

Saludos
Manuel




Perfecto Ulises! Disculpame la tardanza, pero estaba


chequeando todas las
posibilidades antes de contestarte.
Muchísimas gracias...
Liliana.

"ulises" escribió en el


mensaje
news:235f01c4701b$d3040360$
Hola Liliana,

Creo que podrias reemplazar el IF con un JOIN entre ind y
otroind, algo como :

SELECT t3.año,
deuda_origen = t3.deuda,
deuda_actual = t3.deuda * i.indicador
FROM t3
INNER
JOIN
( SELECT ind.año,
( CASE WHEN @parametro < @valor
THEN ind.coeficiente
ELSE otroind.coeficiente
END ) as indicador
FROM ind JOIN otroind ON ind.año = otroind.año ) i
ON t3.año = i.año

Saludos,
Ulises
Respuesta Responder a este mensaje
#8 Liliana Sorrentino
26/07/2004 - 20:12 | Informe spam
Javier,
Tengo preparado el juego de prueba y el query definitivo, pero pesa 61 KB,
¿te parece que te lo mande a tu correo para que lo veas?
Liliana.

"Javier Loria" escribió en el mensaje
news:
Hola Liliana:
He estado dandole vuelta a la consulta y no he logrado una conclusion
sobre consulta siguiente (tengo serias dudas), pero crees que podrias


probar
algo como esto:
==> SELECT Ts.año
, Ts.Deuda_Origen
, Ts.deuda * ind.coeficiente AS deuda_actual
(SELECT T1.año, T1.deuda AS Deuda_Origen
FROM T1
UNION -- ALL ?
SELECT T2.año, T2.deuda
FROM T2
UNION -- ALL ?
SELECT T3.año, T3.deuda
FROM T3
WHERE @Parametro<Valor) AS Ts
INNER JOIN Ind
ON Ts=Ind.año
UNION -- ALL ?
SELECT t3.año
, t3.deuda
, t3.deuda * otroind.coeficiente
FROM t3
INNER JOIN otroind
ON t3.año = otro.año
WHERE @Parametro>=Valor
==> Existe el riesgo de generar mayores costos de compilacion ya que el


plan
de acceso varia sustancialmente dependiendo de si @Parametro es mayor o
menos a Valor.
Espero te sirva,


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.

Liliana Sorrentino escribio:
> Hola Manuel,
> Gracias por la sugerencia.
> En realidad, mi problema era la relación de las tablas más que la
> recuperación de la información, o sea los índices en este caso. No
> encontraba la forma, pero adaptando la respuesta a mis necesidades
> funciona perfecto.
> Haciendo la prueba comparando lo tuyo con la solución de Ulises, no
> hay diferencia en el plan de ejecución, el costo de la consulta es el
> mismo. Gracias por el interés,
> Liliana.
>
> "Manuel Etcheto" escribió en el
> mensaje news:2d6201c470cd$675e5ae0$
> Hola
> ¿no te sirve un simple CASE en el segundo factor del
> producto?
> SELECT t3.año, deuda_origen = t3.deuda, deuda_actual > > t3.deuda * CASE WHEN @parametro < @valor
> THEN ind.coeficiente ELSE otroind.coeficiente END
>
> Saludos
> Manuel
>
>
>
>
>> Perfecto Ulises! Disculpame la tardanza, pero estaba
> chequeando todas las
>> posibilidades antes de contestarte.
>> Muchísimas gracias...
>> Liliana.
>>
>> "ulises" escribió en el
> mensaje
>> news:235f01c4701b$d3040360$
>> Hola Liliana,
>>
>> Creo que podrias reemplazar el IF con un JOIN entre ind y
>> otroind, algo como :
>>
>> SELECT t3.año,
>> deuda_origen = t3.deuda,
>> deuda_actual = t3.deuda * i.indicador
>> FROM t3
>> INNER
>> JOIN
>> ( SELECT ind.año,
>> ( CASE WHEN @parametro < @valor
>> THEN ind.coeficiente
>> ELSE otroind.coeficiente
>> END ) as indicador
>> FROM ind JOIN otroind ON ind.año = otroind.año ) i
>> ON t3.año = i.año
>>
>> Saludos,
>> Ulises
>>
>>> Hola a todos,
>>>
>>> Necesito unir el resultado de varios select, pero la
>> consulta a una de las
>>> tablas está condicionada por el valor de un parámetro y
>> no encuentro la
>>> forma sin tener que caer en un query dinámico.
>>> El caso MUUUUUY simplificado es:
>>>
>>> SELECT t1.año, deuda_origen = t1.deuda, deuda_actual > >> t1.deuda *
>>> ind.coeficiente
>>> FROM t1 INNER JOIN ind ON t1.año = ind.año
>>> UNION
>>> SELECT t2.año, deuda_origen = t2.deuda, deuda_actual > >> t2.deuda *
>>> ind.coeficiente
>>> FROM t2 INNER JOIN ind ON t2.año = ind.año
>>> UNION
>> descriptivo
>>> IF @parametro < valor
>>> SELECT t3.año, deuda_origen = t3.deuda, deuda_actual > >> t3.deuda *
>>> ind.coeficiente
>>> FROM t3 INNER JOIN ind ON t3.año = ind.año
>>> ELSE
>>> SELECT t3.año, deuda_origen = t3.deuda, deuda_actual > >> t3.deuda *
>>> otroind.coeficiente
>>> FROM t3 INNER JOIN otroind ON t3.año = otro.año
>>>
>>> Les agradezco cualquier sugerencia,
>>> Liliana.
>>>
>>>
>>>
>>> .
>>>
>>
>>
>> .


Respuesta Responder a este mensaje
#9 Liliana Sorrentino
26/07/2004 - 20:15 | Informe spam
Hola Manuel,
Si, le había agregado los join correspondientes.
Si querés, te mando lo "casi" real para que le des una mirada, porque como
le digo a Javier, pesa 61 KB con el juego de prueba.
Liliana.

"Manuel Etcheto" escribió en el
mensaje news:410e01c47317$3bebaec0$
Hola Liliana

Bueno, mi sugerencia se completaba con 2 LEFT JOIN,
supongo así lo has hecho.

De todas maneras, según veo tu consulta es mucho más
extensa...
Si como imagino, eso se limita a los últimos 10 años, y
hay muchas llamadas similares, quizá puedas declarar una
tablita al comienzo de SP, llenarla con todos los datos
(anyo, coef1, coef2) y luego hacer los CASE y 1 solo JOIN
para todas las UNION contra esa "tablita matriz"

Salu2
Manuel

Hola Manuel,
Gracias por la sugerencia.
En realidad, mi problema era la relación de las tablas


más que la
recuperación de la información, o sea los índices en este


caso. No
encontraba la forma, pero adaptando la respuesta a mis


necesidades funciona
perfecto.
Haciendo la prueba comparando lo tuyo con la solución de


Ulises, no hay
diferencia en el plan de ejecución, el costo de la


consulta es el mismo.
Gracias por el interés,
Liliana.

"Manuel Etcheto"


escribió en el
mensaje news:2d6201c470cd$675e5ae0$
Hola
¿no te sirve un simple CASE en el segundo factor del
producto?
SELECT t3.año, deuda_origen = t3.deuda, deuda_actual >t3.deuda * CASE WHEN @parametro < @valor
THEN ind.coeficiente ELSE otroind.coeficiente END

Saludos
Manuel




Perfecto Ulises! Disculpame la tardanza, pero estaba


chequeando todas las
posibilidades antes de contestarte.
Muchísimas gracias...
Liliana.

"ulises" escribió en el


mensaje
news:235f01c4701b$d3040360$
Hola Liliana,

Creo que podrias reemplazar el IF con un JOIN entre ind y
otroind, algo como :

SELECT t3.año,
deuda_origen = t3.deuda,
deuda_actual = t3.deuda * i.indicador
FROM t3
INNER
JOIN
( SELECT ind.año,
( CASE WHEN @parametro < @valor
THEN ind.coeficiente
ELSE otroind.coeficiente
END ) as indicador
FROM ind JOIN otroind ON ind.año = otroind.año ) i
ON t3.año = i.año

Saludos,
Ulises
Respuesta Responder a este mensaje
#10 Javier Loria
26/07/2004 - 20:21 | Informe spam
Hola:
Excelente. Mi correo es minombre arroba miapellido punto com

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.
Liliana Sorrentino escribio:
Javier,
Tengo preparado el juego de prueba y el query definitivo, pero pesa
61 KB, ¿te parece que te lo mande a tu correo para que lo veas?
Liliana.

"Javier Loria" escribió en el mensaje
news:
Hola Liliana:
He estado dandole vuelta a la consulta y no he logrado una
conclusion sobre consulta siguiente (tengo serias dudas), pero crees
que podrias probar algo como esto:
==>> SELECT Ts.año
, Ts.Deuda_Origen
, Ts.deuda * ind.coeficiente AS deuda_actual
(SELECT T1.año, T1.deuda AS Deuda_Origen
FROM T1
UNION -- ALL ?
SELECT T2.año, T2.deuda
FROM T2
UNION -- ALL ?
SELECT T3.año, T3.deuda
FROM T3
WHERE @Parametro<Valor) AS Ts
INNER JOIN Ind
ON Ts=Ind.año
UNION -- ALL ?
SELECT t3.año
, t3.deuda
, t3.deuda * otroind.coeficiente
FROM t3
INNER JOIN otroind
ON t3.año = otro.año
WHERE @Parametro>=Valor
==>> Existe el riesgo de generar mayores costos de compilacion ya que
el plan de acceso varia sustancialmente dependiendo de si @Parametro
es mayor o menos a Valor.
Espero te sirva,


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.

Liliana Sorrentino escribio:
Hola Manuel,
Gracias por la sugerencia.
En realidad, mi problema era la relación de las tablas más que la
recuperación de la información, o sea los índices en este caso. No
encontraba la forma, pero adaptando la respuesta a mis necesidades
funciona perfecto.
Haciendo la prueba comparando lo tuyo con la solución de Ulises, no
hay diferencia en el plan de ejecución, el costo de la consulta es
el mismo. Gracias por el interés,
Liliana.

"Manuel Etcheto" escribió en
el mensaje news:2d6201c470cd$675e5ae0$
Hola
¿no te sirve un simple CASE en el segundo factor del
producto?
SELECT t3.año, deuda_origen = t3.deuda, deuda_actual >>> t3.deuda * CASE WHEN @parametro < @valor
THEN ind.coeficiente ELSE otroind.coeficiente END

Saludos
Manuel




Perfecto Ulises! Disculpame la tardanza, pero estaba


chequeando todas las
posibilidades antes de contestarte.
Muchísimas gracias...
Liliana.

"ulises" escribió en el


mensaje
news:235f01c4701b$d3040360$
Hola Liliana,

Creo que podrias reemplazar el IF con un JOIN entre ind y
otroind, algo como :

SELECT t3.año,
deuda_origen = t3.deuda,
deuda_actual = t3.deuda * i.indicador
FROM t3
INNER
JOIN
( SELECT ind.año,
( CASE WHEN @parametro < @valor
THEN ind.coeficiente
ELSE otroind.coeficiente
END ) as indicador
FROM ind JOIN otroind ON ind.año = otroind.año ) i
ON t3.año = i.año

Saludos,
Ulises

Hola a todos,

Necesito unir el resultado de varios select, pero la


consulta a una de las
tablas está condicionada por el valor de un parámetro y


no encuentro la
forma sin tener que caer en un query dinámico.
El caso MUUUUUY simplificado es:

SELECT t1.año, deuda_origen = t1.deuda, deuda_actual >>>> t1.deuda *
ind.coeficiente
FROM t1 INNER JOIN ind ON t1.año = ind.año
UNION
SELECT t2.año, deuda_origen = t2.deuda, deuda_actual >>>> t2.deuda *
ind.coeficiente
FROM t2 INNER JOIN ind ON t2.año = ind.año
UNION


descriptivo
IF @parametro < valor
SELECT t3.año, deuda_origen = t3.deuda, deuda_actual >>>> t3.deuda *
ind.coeficiente
FROM t3 INNER JOIN ind ON t3.año = ind.año
ELSE
SELECT t3.año, deuda_origen = t3.deuda, deuda_actual >>>> t3.deuda *
otroind.coeficiente
FROM t3 INNER JOIN otroind ON t3.año = otro.año

Les agradezco cualquier sugerencia,
Liliana.



.





.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida