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

#1 ulises
22/07/2004 - 20:43 | Informe spam
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
#2 Liliana Sorrentino
22/07/2004 - 21:15 | Informe spam
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
#3 Manuel Etcheto
23/07/2004 - 17:54 | Informe spam
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
#4 Liliana Sorrentino
23/07/2004 - 18:56 | Informe spam
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
#5 Javier Loria
23/07/2004 - 19:55 | Informe spam
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 Respuesta Tengo una respuesta
Search Busqueda sugerida